Android 来自广播接收器的startActivity()
我正在尝试使用onPause()方法中实现的以下BroadcastReceiver在充电时自动启动我的夜间时钟应用程序: 当USB电缆插入时,会触发onReceive()方法,但活动不会启动。但是,日志显示: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 } 你知道为什么日志上说活动已启动,但什么也没有发生吗?如果你的目标是希望在
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);
}