Android 来自广播接收器的startActivity()

Android 来自广播接收器的startActivity(),android,android-activity,broadcastreceiver,Android,Android Activity,Broadcastreceiver,我正在尝试使用onPause()方法中实现的以下BroadcastReceiver在充电时自动启动我的夜间时钟应用程序: 当USB电缆插入时,会触发onReceive()方法,但活动不会启动。但是,日志显示: I/ActivityManager( 79): Starting activity: Intent { flg=0x10000000 cmp=com.meins.nightclock/.NightClock } 你知道为什么日志上说活动已启动,但什么也没有发生吗?如果你的目标是希望在

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

当USB电缆插入时,会触发onReceive()方法,但活动不会启动。但是,日志显示:

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

你知道为什么日志上说活动已启动,但什么也没有发生吗?

如果你的目标是希望在发送
动作\u电源\u连接的广播时启动
夜钟,那么你使用
广播接收器的方法很好。但是,不要从活动中注册它。而是在清单中注册:

<receiver android:name=".OnPowerReceiver">
        <intent-filter>
                <action android:name="android.intent.action.ACTION_POWER_CONNECTED" />
        </intent-filter>
</receiver>

然后,将您的
BroadcastReceiver
作为一个公共Java类(此处命名为
OnPowerReceiver
,尽管您可以随意调用它),并让它调用
startActivity()


请记住,用户可能不希望您这样做。除了启动“夜间时钟”外,还有许多其他的连接手机的情况。我谦虚地建议您只需让用户通过主屏幕启动您的活动。

您已经将上下文作为参数传递给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);
}
它可以工作,当然您必须将包和活动类名称更改为您自己的名称。

来自:

不要从广播接收器开始活动,因为用户体验不和谐;特别是如果有多个接收器。相反,考虑显示一个通知。


请用LogCat的更多信息更新您的问题——在这一行之前几行,在这一行之后十几行。另外,为什么
标记活动\u新任务
?此外,当操作\u电源\u连接时,注册此
广播接收器的活动是否仍然存在?当连接电源时,LogCat中没有更多线路。
BroadcastReceiver
已在其应启动的同一活动中注册。此活动仍在后台运行(LogCat应用程序已置于前端)。如果此活动在taskmanager中被终止,
BroadcastReceiver
似乎根本不会触发。这种自动启动我的应用程序的方法从一开始就错了吗?我已经在清单中注册了
BroadcastReceiver
,就像您在
onReceive()
方法中所说的那样:
context.startActivity(新意图(context,NightClock.class))
但当我将手机连接到电源时,什么也没有发生。如果我添加
log.d(this.toString(),“尝试启动应用程序…”),则甚至不会添加日志条目到方法。@Gubbel:Oops。试试
。大多数情况下,他们在字符串中没有
操作
,但显然在这个字符串中有。如果应用程序从任务列表中删除,会怎么做?此处消息不会在您的广播接收器上触发。它将通过“click\u action”参数进行处理。您需要设置标志
setFlags(Intent.flag\u ACTIVITY\u NEW\u TASK)
Why downvote?这不好吗?它帮了我很大的忙,因为我找不到任何证据表明这是一个糟糕的方法。@Mafro34我只是尝试了同样的方法,我认为这不理想的原因是他设置的旗帜。因为除非这是您想要的(运行一个新任务),否则它可能会严重扰乱您的应用程序逻辑——不管怎样,我的应用程序逻辑也是如此。所以,除非这是您想要的,否则我建议您找到另一种方法。@AgentKnopf看起来您没有太多选择:(来自):请注意,如果此方法是从活动上下文外部调用的,则意图必须包括标志\u Activity\u NEW\u TASK launch标志。这是因为,没有从现有活动启动,就没有可放置新活动的现有任务,因此需要将其放置在自己的单独任务中。“当应用程序未处于放弃/非活动状态时,FLAG_Activity_new_task运行良好。我注意到在MI设备中有一个额外的设置”在后台运行时显示弹出窗口“当我打开该设置时,它在默认情况下处于关闭状态。在许多默认应用程序(如闹钟和来电)中,它们会覆盖该设置。因此,如果用户希望发生这种情况,则这是他的电话。而您的答案不会回答问题。
 @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);
}