繁体   English   中英

获取 Android 中某个接口的所有实现列表

[英]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" />
  • NetworkChangeListener.java
/* Interface required to call in each activity with whom you extends BaseActivity.java */
public interface NetworkChangeListener {
    void networkAvailable();

    void networkUnavailable();
}
  • BaseActivity.java

@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();
    }
  • MainActivity.java

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM