[英]Get a list of all the implementations of an Interface in Android
我正在 Android 开展一个项目,想知道每个活动中的 Inte.net 连接 State,我的应用程序有超过 15 个活动,所以我不想在每个活动中实施和初始化 my.networkstatechanged class 和接口。 因此,我在扩展应用程序的 class 中创建了它的实例,我在其中创建了我的界面的 object。
我的网络状态已更改 Class:
NetworkConnected.java
package time.real.identify.location.tracker.gps.saksham.com.emptrackerhost;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.util.ArrayList;
import java.util.List;
interface NetworkListener {
void isConnected();
void isDisconnected();
}
public class NetworkConnected {
private List<NetworkListener> listeners = new ArrayList<NetworkListener>();
private boolean isConnected = false;
private boolean wasConnected = false;
NetworkConnected() {
new Thread(new Runnable() {
@Override
public void run() {
isConnected = isOnline();
wasConnected = isConnected;
notifySomethingHappened();
while(true){
isConnected = isOnline();
if(wasConnected != isConnected){
wasConnected = isConnected;
notifySomethingHappened();
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
}
private boolean isOnline() {
try {
int timeoutMs = 3000;
Socket sock = new Socket();
SocketAddress sockaddr = new InetSocketAddress("8.8.8.8", 53);
sock.connect(sockaddr, timeoutMs);
sock.close();
return true;
} catch (IOException e) {
return false;
}
}
void addListener(NetworkListener listener) { listeners.add(listener); }
private void notifySomethingHappened() {
for (NetworkListener listener : listeners) {
if(isConnected){
listener.isConnected();
}
else{
listener.isDisconnected();
}
}
}
}
ApplicationClass.java
package time.real.identify.location.tracker.gps.saksham.com.emptrackerhost;
import android.app.Application;
public class ApplicationClass extends Application {
public static boolean isNetworkConnected = false;
@Override
public void onCreate() {
super.onCreate();
new NetworkConnected().addListener(new time.real.identify.location.tracker.gps.saksham.com.emptrackerhost.NetworkListener() {
@Override
public void isConnected() {
isNetworkConnected = true;
}
@Override
public void isDisconnected() {
isNetworkConnected = false;
}
});
}
}
在此之后,我只想在每个 class 中实现一个接口,因为一个 object 已经在运行,所以不需要添加为侦听器或初始化。
我想要这样的东西:-
public class LoginPageClass extends Activity implements NetworkListener
{
public void isConnected(){
//Make a Snackbar
}
public void isDisconnected(){
//Make a Snackbar
}
}
注意:- 我不想从 ApplicationClass 调用 myNetworkListener Class 的 object 来添加监听器(this);
我只想获取实现我的 NetworkConnected Class 的类列表,以便向它们提供 state 更改回调。 可能吗? 如果是这样,如何?
当然,在 Java 上你不能扩展两个类,所以你可以创建一个新的 class BaseAcivity 来扩展 class 活动,并在这个 class (BaseActivity) 上的 NetworkConnected 上完成工作,并将它扩展到你的活动而不是 class 活动。
您可以使用 BaseActivity As abstract 并根据 .network 更改检查 inte.net。
<!--Manifest.xml-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
/* Interface required to call in each activity with whom you extends BaseActivity.java */
public interface NetworkChangeListener {
void networkAvailable();
void networkUnavailable();
}
@SuppressLint("Registered")
public abstract class BaseActivity extends AppCompatActivity implements NetworkChangeListener {
private BroadcastReceiver networkStateReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
/* previous way of doing it*/
NetworkInfo ni = null;
if (manager != null) {
ni = manager.getActiveNetworkInfo();
}
if (ni != null && ni.isConnected()) {
networkAvailable();
} else {
networkUnavailable();
}
}
};
/*
* If you like to check it manually you also cam use the bellow function for it
* */
public void checkInternet() {
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
/* previous way of doing it*/
NetworkInfo ni = null;
if (manager != null) {
ni = manager.getActiveNetworkInfo();
}
if (ni != null && ni.isConnected())
networkAvailable();
else
networkUnavailable();
}
@Override
protected void onResume() {
super.onResume();
Log.e("NETWORK_STATE", "networkStateReceiver registerReceiver");
registerReceiver(networkStateReceiver, new IntentFilter(android.net.ConnectivityManager.CONNECTIVITY_ACTION));
}
@Override
protected void onPause() {
super.onPause();
Log.e("NETWORK_STATE", "networkStateReceiver unregisterReceiver");
unregisterReceiver(networkStateReceiver);
}
}
如果您想手动检查 Inte.net,您可以使用
/*
* If you like to check it manually you also cam use the bellow function for it
* */
public void checkInternet() {
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
/* previous way of doing it*/
NetworkInfo ni = null;
if (manager != null) {
ni = manager.getActiveNetworkInfo();
}
if (ni != null && ni.isConnected())
networkAvailable();
else
networkUnavailable();
}
public class MainActivity extends BaseActivity {
/*
* Check the log for the proper results
* */
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public void networkAvailable() {
Log.e("NETWORK_STATE", "Connected");
}
@Override
public void networkUnavailable() {
Log.e("NETWORK_STATE", "Not Connected");
}
}
另外,如果有任何遗漏,请参考Github 回购
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.