android - 使用广播接收器android关闭应用程序

标签 android broadcastreceiver broadcast

您好,我正在尝试使用广播接收器来触发一些操作

  1. Activity A 将广播操作“ACTION_EXIT”并进入主 Activity 。

  2. 只要 Main Activity 收到广播“ACTION_EXIT”,它就会关闭应用程序。

我在 Activity A 上的代码(发送广播)

Intent broadcastIntent = new Intent(Beacon_MainActivity.this, MainActivity.class);
broadcastIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
broadcastIntent.setAction("com.package.ACTION_EXIT");
sendBroadcast(broadcastIntent);
finish();

Main Activity 上接收广播并触发 ACTION_EXIT 的代码

private void registerReceiver(){
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("com.package.ACTION_EXIT");
        registerReceiver(myBroadcastReceiver, intentFilter);
    }

@Override
public void onResume() {
    registerReceiver();
    super.onResume();

}

@Override
public void onPause() {
    super.onPause();
    unregisterReceiver(myBroadcastReceiver);
}

BroadcastReceiver myBroadcastReceiver =
        new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                Log.d("onReceive", "Logout in progress");
                Toast.makeText(MainActivity.this, "what the ****", Toast.LENGTH_SHORT).show();
                finish();
            } 
        };

不知道为什么不工作,任何人都可以提供帮助,不胜感激

(app should be close when Main_Activity receive the broadcast on resume)

最佳答案

ActivityA 运行时,您的 MainActivity 暂停,在此期间您的 Receiver 未注册,因此无法接收广播。您可以通过结果转发来完成您想要的。

MainActivity中,使用startActivityForResult()方法启动LoginActivity,并覆盖onActivityResult()方法处理结果。

public static final int REQUEST_CODE = 0;
public static final String EXTRA_EXIT = "exit";
...

Intent actLogin = new Intent(this, LoginActivity.class);
startActivityForResult(actLogin, REQUEST_CODE);
...

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch(requestCode) {
        case REQUEST_CODE:
            if(data == null) {
                return;
            }

            boolean shouldExit = data.getBooleanExtra(EXTRA_EXIT, false);

            if(shouldExit) {
                finish();
            }
            break;
        ...
    }
}

然后,在 LoginActivity 中,将 FLAG_ACTIVITY_FORWARD_RESULT 添加到用于启动 ActivityA 的 Intent 中。

Intent actA = new Intent(this, ActivityA.class);
actA.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
startActivity(actA);
finish();

ActivityA中,设置一个boolean值来表示是否退出,将其添加到一个结果Intent中,设置为结果,并完成 Activity 。

boolean shouldExit = ...            

Intent result = new Intent();
result.putExtra(MainActivity.EXTRA_EXIT, shouldExit);
setResult(Activity.RESULT_OK, result);
finish();

然后结果将被传送回 MainActivity。这也可以仅使用结果代码来完成,但我更喜欢使用 Intent extras。

关于android - 使用广播接收器android关闭应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33910673/

相关文章:

c - 接收 UDP 广播,没有分配地址与 Linux/C/IPv4 接口(interface)

java - 无法使用maven导入库

android sdk获取广播自动续订订阅

android - 如何在android中获取电子邮件发送或丢弃的确认

java - 前台通知操作不发送广播

android - ACTION_MEDIA_BUTTON Intent 的 BroadcastReceiver 在每次 MediaButton 单击时触发两次

android - 检测应用程序是否被手动关闭

android - 如何将广播从一个应用程序发送到另一个应用程序

java - 此组件要求您指定有效的 TextAppearance 属性

android - 频繁登录退出后谷歌登录失败