【问题标题】:Using broadcast receiver android to close app使用广播接收器android关闭应用程序
【发布时间】:2015-11-25 07:24:12
【问题描述】:

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

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

  2. 每当 Main Activity 收到广播“ACTION_EXIT”时,它都会关闭应用程序。

我在活动 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();
            } 
        };

不知道为什么它不起作用,任何人都可以帮助应该非常感谢

(当 Main_Activity 接收到广播时,应用程序应该关闭 简历)

【问题讨论】:

  • 如果 Activity A 在屏幕上,MainActivity 会暂停。查看它的onPause() 方法。接收方在此处未注册。
  • 发送完广播后,finish()方法会关闭activity A并启动Main_activity。这是我的意图
  • 如果您从 MainActivity 启动 Activity A,请改用 startActivityForResult(),并在结果中将退出值传回 MainActivity。无需接收器。
  • Activity A 从 Login_Activity 开始。我的流程是 Main_Activity -->Login Activity---> Activity A. 并且要求是从 Activity A 退出应用程序
  • 假设您在启动 Activity A 后完成 LoginActivity,然后使用添加了 FLAG_ACTIVITY_FORWARD_RESULT 的 Intent 启动 Activity A。 Activity A 的结果将被传递回 MainActivity。

标签: android broadcastreceiver broadcast


【解决方案1】:

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

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。

【讨论】:

  • 我收到这些错误docs.google.com/document/d/…
  • 糟糕,是的,我在编辑代码时不小心删除了 null 检查。等一下。
  • 非常感谢我再次尝试,但 actA 只进入主活动(不退出应用程序)。当我在 Main Activity 上手动设置 shouldexit=true 时,应用程序可以从 Act A 退出。可能是函数 boolean shouldExit = data.getBooleanExtra(EXTRA_EXIT, false);不工作
  • 我必须查看您的代码才能告诉您出了什么问题。如果你想再放到 Docs 上,我去看看。
  • docs.google.com/document/d/…。这是我的代码。可能是有意图的问题无法将数据返回到 Main Activity
猜你喜欢
  • 1970-01-01
  • 2013-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-20
  • 2015-11-12
相关资源
最近更新 更多