从BroadcastReceiver开始一个带有结果的活动

时间:2011-12-21 21:22:09

标签: android android-activity broadcastreceiver

我可以通过这种方式从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());
        }
    }
}

这会将应用程序置于最前面,并在活动中调用onResume()。我的问题是我无法确定BroadcastReceiver是否将我带到了onResume()或仅仅是用户本身。有什么办法可以确定BroadcastReceiver是否调用了Activity?

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

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

2 个答案:

答案 0 :(得分:2)

你可以在你的意图中发送额外内容并在onceceive上检查它们,但这样做的正确方法是为“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);

然后在活动的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”置于静态变量中并在两个地方使用它!

答案 1 :(得分:0)

广播接收器无法通过附加功能 http://developer.android.com/reference/android/content/BroadcastReceiver.html

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

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