【问题标题】:Start an Activity from a BroadcastReceiver with a result从 BroadcastReceiver 启动一个 Activity 并返回结果
【发布时间】:2011-12-21 21:22:08
【问题描述】:

我可以通过这种方式从 BroadcastReceiver 调用 Activity:

public class AlarmReceiver extends BroadcastReceiver
{
    @Override
    public void onReceive(Context context, Intent intent)
    {
        try {
            Intent i = new Intent(context, MyActivity.class);
            i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(i);

            Log.v(TAG, "alarm triggered");
        } catch (Exception e) {
            Log.v(TAG, e.toString());
        }
    }
}

这会将应用程序带到最前面并在 Activity 上调用 onResume()。我的问题是我无法确定 BroadcastReceiver 是否将我带到onResume() 或只是手动将用户本身带到。有什么方法可以确定 BroadcastReceiver 调用了 Activity?

我还尝试通过 i.putExtra("foo", "bar") 使用 Extras 填充 BroadcastReceiver 的 Intent。我无法通过在 Activity 中调用 MyActivity.getIntent().getExtras().get("foo") 来读出它。

希望有人能帮我解决这个问题,非常感谢!

【问题讨论】:

    标签: android android-activity broadcastreceiver


    【解决方案1】:

    您可以在您的意图中发送额外内容并在接收时检查它们,但正确的做法是为“STARTED_BY_RECEIVER”设置一个布尔值;

    启动活动时,将第三行放入你的 onReceive 回调方法中;

    Intent i = new Intent(context, MyActivity.class);
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    i.putExtra("STARTED_BY_RECEIVER", true);
    context.startActivity(i);
    

    然后在activity的onCreate中,你可以像这样检查它是否是由广播接收器启动的;

    if(getIntent().getExtras() != null && getIntent().getExtras().getBoolean("STARTED_BY_RECEIVER")){
        // The activity was started by the receiver
    }
    else{
       // The activity was started by user
    

    这是可行的,因为当没有额外的“STARTED_BY_RECEIVER”时,getBoolean 方法将返回 false,这样您只需将标志放在一个位置(由接收者开始)

    另外不要忘记将“STARTED_BY_RECEIVER”放在静态变量中并在两个地方都使用它!

    【讨论】:

    • 将“STARTED_BY_RECEIVER”放在静态变量中并在两个地方都使用它是什么意思?正如所见,没有变量 STARTED_BY_RECEIVER 我可以通过像STARTED_BY_RECEIVER == true; 这样的正常方式检查这对我不起作用,除了“静态变量”之外,我做了你所说的一切。 if(getIntent().getExtras() != null && getIntent().getExtras().getBoolean("STARTED_BY_RECEIVER")) 的情况从未发生过,尽管我在我的 BroacastReceiver 中做了i.putExtra("STARTED_BY_RECEIVER", true)
    • 好吧忘记静态的事情。你把 if() 放在 onCreate 中对吗?如果它是从接收方调用的,则为真,因此 if 子句将运行,如果由用户调用,则 else 将运行,因为那里不会有 ("STARTED_BY_RECEIVER") 额外内容。现在您需要彻底正如我在回答中并告诉我什么不起作用,只是说“这对我不起作用”并没有帮助
    • 在我的 BroadcastReceiver 的onReceive() 方法中,我在context.startActivity(i) 开始活动之前设置了i.putExtra("STARTED_BY_RECEIVER", true);。在我的活动中,我将if(getIntent().getExtras() != null && getIntent().getExtras().getBoolean("STARTED_BY_RECEIVER")) 放入我的onCreate() 方法中,但 if 子句永远不会成立。这就是我所做的,抱歉不当,感谢您的参与。
    • 我的代码中有这个,它可以工作。我唯一能想到的是,该活动可能不会被广播者调用。你能确认你的广播接收器正在启动活动(如果不从那里调用它永远不会是真的)。你能调试和单步调试 onReceive 方法吗?
    • 抱歉,您需要的一切都在那里。我确信这应该可以按预期工作,不幸的是我无法将我的代码发送给您,因为它包含更多内容。您应该真正考虑调试和单步执行代码。检查“STARTED_BY_BROADCASTER”的拼写...您也可以将代码复制粘贴到您的问题中,我会看看它
    【解决方案2】:

    广播接收器无法传递附加信息 http://developer.android.com/reference/android/content/BroadcastReceiver.html

    您可以尝试反向执行,让打开活动的用户操作将布尔值设置为 true 作为您可以检查的默认值

    boolean userStarted = getIntent().getExtras().getBoolean('userStarted', false);
    

    【讨论】:

    • 但是我应该在哪里设置 userStarted?我需要一些可以确定用户恢复活动而不是广播接收器的情况。反过来也是同样的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    相关资源
    最近更新 更多