来自BroadcastReceiver的startActivity()

Gub*_*bel 38 android broadcastreceiver android-activity

我正在尝试使用onPause()方法中实现的以下BroadcastReceiver自动启动我的nightclock应用程序进行充电:

BroadcastReceiver test = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        unregisterReceiver(this);
        Intent i = new Intent(context, NightClock.class);
        i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(i);   
    }           
};
registerReceiver(test, new IntentFilter(Intent.ACTION_POWER_CONNECTED));
Run Code Online (Sandbox Code Playgroud)

插入USB电缆时会触发onReceive()方法,但活动无法启动.但是日志显示了这个:

I/ActivityManager(   79): Starting activity: Intent { flg=0x10000000 cmp=com.meins.nightclock/.NightClock }
Run Code Online (Sandbox Code Playgroud)

日志说活动开始的任何想法,但没有任何反应?

Sat*_*ish 61

您将上下文作为参数传递给onRecieve()方法,因此只需使用:

 @Override
public void onReceive(Context context, Intent intent) {
    //start activity
    Intent i = new Intent();
    i.setClassName("com.test", "com.test.MainActivity");
    i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startActivity(i);
}
Run Code Online (Sandbox Code Playgroud)

它有效,当然你必须将包和活动类名更改为你自己的.

  • @AgentKnopf看起来你没有太多选择:(来自http://developer.android.com/reference/android/content/Context.html#startActivity%28android.content.Intent,%20android.os.Bundle% 29):"请注意,如果从活动上下文外部调用此方法,则Intent必须包含FLAG_ACTIVITY_NEW_TASK启动标志.这是因为,没有从现有活动启动,没有现有的任务可以放置新的活动,因此需要把它放在自己独立的任务中." (6认同)
  • 为什么选择downvote?这不好吗?它帮助我+1,因为我什么也没发现它说这是一个糟糕的方法. (2认同)

Com*_*are 21

如果您的目标是NightClock在发送ACTION_POWER_CONNECTED广播时想要启动,那么您使用a的方法就可以了BroadcastReceiver.但是,请勿从活动中注册.而是在清单中注册它:

<receiver android:name=".OnPowerReceiver">
        <intent-filter>
                <action android:name="android.intent.action.ACTION_POWER_CONNECTED" />
        </intent-filter>
</receiver>
Run Code Online (Sandbox Code Playgroud)

然后,让你BroadcastReceiver作为一个公共Java类(这里命名OnPowerReceiver,虽然你可以随意调用它),并让它调用startActivity().

请记住,用户可能不希望您这样做.除了启动"夜钟"之外,还有许多其他情况可以将手机连接到电源.我谦卑地建议你让用户通过主屏幕开始你的活动.

  • @Gubbel:哎呀.尝试`<action android:name ="android.intent.action.ACTION_POWER_CONNECTED"/>`.大多数时候,他们在字符串中没有`ACTION_`,但显然他们在这个字符串上做了. (2认同)