简体   繁体   English

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

[英]Get a list of all the implementations of an Interface in Android

I am working on a project in Android and want to know the Inte.net Connection State in every Activity and my App has more than 15 activities so, I don't want to implement and initialize my.networkstatechanged class and interface in every activity.我正在 Android 开展一个项目,想知道每个活动中的 Inte.net 连接 State,我的应用程序有超过 15 个活动,所以我不想在每个活动中实施和初始化 my.networkstatechanged class 和接口。 So, I have created it's instance in a class that extends Application in which I create a object of my interface.因此,我在扩展应用程序的 class 中创建了它的实例,我在其中创建了我的界面的 object。

My NetworkStateChanged Class:我的网络状态已更改 Class:

NetworkConnected.java 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 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;
            }
        });
    }

}

After this I would just like to implement a interface in every class which would not need to be added as listener or initialized since one object is already running.在此之后,我只想在每个 class 中实现一个接口,因为一个 object 已经在运行,所以不需要添加为侦听器或初始化。

I want something like this:-我想要这样的东西:-

public class LoginPageClass extends Activity implements NetworkListener
{
public void isConnected(){
//Make a Snackbar
}
public void isDisconnected(){
//Make a Snackbar
}
}

Note:- I don't want to call object of myNetworkListener Class from ApplicationClass to add listener(this);注意:- 我不想从 ApplicationClass 调用 myNetworkListener Class 的 object 来添加监听器(this);

I just want to get a list of classes that implement my NetworkConnected Class in order to provide a state change callback to them.我只想获取实现我的 NetworkConnected Class 的类列表,以便向它们提供 state 更改回调。 Is it possible?可能吗? If so, how?如果是这样,如何?

Of course on Java you can't extends two classes, so you can create a new class BaseAcivity that extends class Activity and make the job done on the NetworkConnected on this class (BaseActivity), and extend it on your activities instead of class Activity.当然,在 Java 上你不能扩展两个类,所以你可以创建一个新的 class BaseAcivity 来扩展 class 活动,并在这个 class (BaseActivity) 上的 NetworkConnected 上完成工作,并将它扩展到你的活动而不是 class 活动。

You can use BaseActivity As abstract and check the the inte.net as per the.network changes.您可以使用 BaseActivity As abstract 并根据 .network 更改检查 inte.net。

  • Require permissions需要权限
<!--Manifest.xml-->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  • NetworkChangeListener.java NetworkChangeListener.java
/* Interface required to call in each activity with whom you extends BaseActivity.java */
public interface NetworkChangeListener {
    void networkAvailable();

    void networkUnavailable();
}
  • BaseActivity.java 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);
    }
}


if you like to check the Inte.net manually you can use如果您想手动检查 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 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");
    }
}

Also if anything missed please refer Github repo另外,如果有任何遗漏,请参考Github 回购

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 扩展接口的所有实现的功能? - Extending functionality of all implementations of an Interface? 使用 Dagger 注入接口的所有实现 - Inject all implementations of an interface using Dagger 如何使用guice自动安装接口的所有实现? - How to auto install all implementations of an interface with guice? 如何为接口的所有实现实现compareTo? - How to implement compareTo for all implementations of an interface? 链接列表实现中position接口的用途是什么? - What is the use of the position interface in the Linked list implementations? Java - 允许实现指定参数列表的接口 - Java - Interface to allow implementations to specify parameter list 如何查找 Java 接口的所有实现,而不将它们全部实例化 - How to find all implementations of a Java interface, without instantiating them all 访问者模式,并非所有访问者对接口中的所有方法都有合理的实现 - Visitor pattern, not all visitors have a reasonable implementations for all methods in the interface IntelliJ Idea结构搜索所有导入接口的实现 - IntelliJ Idea structural search for implementations of all imported interface 为什么坚持接口的所有实现都扩展了基类? - Why insist all implementations of an interface extend a base class?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM