[英]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.