【问题标题】:Close Top Activity from Broadcast Receiver从广播接收器关闭顶部活动
【发布时间】:2016-07-21 04:56:52
【问题描述】:

我按照本教程来检测网络变化并在没有网络连接时提醒用户:

http://viralpatel.net/blogs/android-internet-connection-status-network-change/

我修改了代码,以便在用户断开网络连接时打开一个名为 NoInternetConnection 的活动。

当用户重新连接到网络时,我想关闭 NoInternetConnection 活动。我无法用广播接收器解决这个问题。有关如何执行此操作的任何提示?

这是我的广播接收器:

public class NetworkChangeReceiver extends BroadcastReceiver {

    private static final String TAG = NetworkChangeReceiver.class.getSimpleName();

    @Override
    public void onReceive(final Context context, final Intent intent) {

        String status = NetworkUtil.getConnectivityStatusString(context);
        Log.d(TAG, "status: " + status);

        ActivityManager am = (ActivityManager) context.
                getSystemService(Activity.ACTIVITY_SERVICE);
        String className = am.getRunningTasks(1).get(0).topActivity.getClassName();

        if(status == "connected"){
            if(className.toLowerCase().contains("nointernetactivity")){
                // check if the No Internet Activity context is visible
                Log.d(TAG, "Close noInternetActivity");

            }

        }else {
            if(!className.toLowerCase().contains("nointernetactivity")){
                Log.d(TAG, "opening NoInternetActivity");
                Intent i = new Intent(context, NoInternetActivity.class);
                i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(i);
            }
        }
//        Toast.makeText(context, status, Toast.LENGTH_LONG).show();
    }
}

【问题讨论】:

    标签: android broadcastreceiver


    【解决方案1】:

    在我的 NoInternetActivity 中,我创建了一个广播接收器来关闭活动:

    public class NoInternetActivity extends AppCompatActivity {
    
        private static Context context;
        private BroadcastReceiver _closeActivityReceiver = new CloseActivityReceiver();
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_no_internet);
            context = this;
    
            IntentFilter filter = new IntentFilter("closeNoInternetActivity");
            this.registerReceiver(_closeActivityReceiver, filter);
    
        }
    
        private class CloseActivityReceiver extends BroadcastReceiver {
            @Override
            public void onReceive(Context context, Intent intent) {
                // close this damn activity!
                finish();
            }
        }
    
        @Override
        public void onDestroy(){
            super.onDestroy();
            this.unregisterReceiver(this._closeActivityReceiver);
        }
    
    }
    

    然后我在我的广播接收器中这样调用它:

            if(className.toLowerCase().contains("nointernetactivity")){
                // check if the No Internet Activity context is visible
                Log.d(TAG, "Close noInternetActivity");
                Intent in = new Intent("closeNoInternetActivity");
                context.sendBroadcast(in);
    
            }
    

    【讨论】:

    • 您可以考虑为此使用LocalBroadcastManager。与标准广播和BroadcastReceivers 的模式相同 - 即,您只需将其放入 - 但广播会保留在您的应用程序中,并且通常更快,明显。
    • 我的理解是,将“上下文”设为静态是不受欢迎的。 Android Studio 会抱怨。然而,它是这项工作的关键。
    猜你喜欢
    • 2018-03-13
    • 1970-01-01
    • 2011-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多