【问题标题】:BroadcastReceiver doesn't start activity when app closed应用程序关闭时,BroadcastReceiver 不启动活动
【发布时间】:2017-03-15 14:16:53
【问题描述】:

所以,我今天已经尝试实现这一目标至少五个小时,并且我已经尝试了任何在任何地方找到的解决方案。

我正在编写一个小时钟应用程序,使用 AlarmManager 使应用程序响起。当我的应用程序打开或最小化时,它工作正常。我试图在应用程序关闭时使其工作,这就是问题所在。所以,有一段代码设置了 AlarmManager :

    AlarmManager am = (AlarmManager) ctxt.getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(ctxt, AlarmService.class);
    PendingIntent pen = PendingIntent.getBroadcast(ctxt, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    am.setExact(AlarmManager.RTC_WAKEUP, nextRing.getTime(), pen);

(这里,ctxt 是上下文,getApplicationContext() 和 getBaseContext() 都试过了,nextRing.getTime() 是表示日期的 long)

然后,我有我的 AlarmService 类(它曾经是一个服务,它解释了名称,但现在是一个 BroadcastReceiver,我只是不想现在重命名它)

public class AlarmService extends BroadcastReceiver {

  @Override
  public void onReceive(Context context, Intent intent) {

    /*Intent cust = new Intent(context, CustomIntent.class);
    context.startService(cust);*/
    Bundle extras = intent.getExtras();
    Intent newIntent = new Intent(context, AlarmActivity.class);
    newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    newIntent.putExtra("AlarmName", extras.getString("AlarmName"));
    context.startActivity(newIntent);
  }

}

所以这是仅使用 BroadcastReceiver 的尝试,这显然不起作用,所以我尝试添加一个 IntentService(顶部注释掉的代码),它具有以下代码

public class CustomIntent extends IntentService {
  public CustomIntent() {
    super("CustomIntent");
  }

  @Override
  protected void onHandleIntent(Intent intent) {
    Intent newIntent = new Intent(getBaseContext(), AlarmActivity.class);
    newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    getApplication().startActivity(newIntent);
  }
}

...这也不行!最后,这是我使用的清单:

<application>
[Here goes stuff that have nothing to do with my bug]
    <receiver android:name=".custom_classes.AlarmService"/>
    <service
      android:name="com.group9.abclock.custom_classes.CustomIntent"
      android:enabled="true" >
      <intent-filter>
        <action android:name="com.group9.abclock.custom_classes.CustomIntent" />
      </intent-filter>
    </service>
  </application>

对于(非常)长的帖子感到抱歉,但我很难解释我尝试过的任何事情。如果您能提供帮助,请提前致谢!

【问题讨论】:

    标签: android broadcastreceiver alarmmanager android-pendingintent intentservice


    【解决方案1】:

    如果你的应用程序关闭了,你不能触发广播接收器,因为它没有注册,你不能使用上下文方法,因为没有上下文。

    如果您想在应用程序关闭时执行任务,您必须使用服务创建另一个项目,并使用您的应用程序启动它。

    服务在后台运行,直到有人杀死它,一旦它启动,主应用程序就不再需要了。所以必须在这个服务中实现环功能。

    请记住,AlarmManager.setExact 与 API 23 并不完全相同,因为 Doze Mode

    【讨论】:

    • 所以,我只是尝试使用 PendingIntent.getService() 并使用我的 CustomIntent(它扩展了 IntentService,它扩展了 Service)来触发它。当我的应用程序运行时它仍然可以正常工作(我发现使该部分工作的数量令人印象深刻)但是当我关闭它时没有任何活动...... setExat 怎么不那么精确?几秒钟还可以,但几分钟不适合我的情况(不过,当它起作用时,对我来说似乎很准确)
    • Edit :只需阅读您的链接,我当前的 lvl api 是 21;虽然我的手机已经超过 23 岁。可以肯定的是,我使用了 setExactAndAllowWhileIdle();空闲时会触发,但关闭时仍然没有修复我的错误
    • 关闭应用程序后,您是否查看了正在运行的进程并检查您的服务是否仍在运行?如果包不存在,则无法调用该方法。如果是这种情况,服务将与应用程序一起关闭,因此您必须以某种方式将它们分开。
    • 好吧。我回来了:我的代码就像一个魅力;当应用程序关闭时它会触发,这可能部分归功于您和这里的其他人。我只是发现是我的愚蠢手机导致了问题。我正在使用华为 P9 Lite(和我一起工作的所有人也在使用华为);那个愚蠢的事情是杀死带有调试标志的应用程序启动的任何服务(当您通过 Android Studio 安装应用程序时,它会打开,我显然正在这样做)。因此,任何阅读此内容的人:如果您使用的是华为,请尝试使用其他设备进行模拟(可能已经在使用)
    • 这个答案是错误的。如果您的应用未运行,您可以触发BroadcastReceiver。清单中的条目就是所需要的。你不需要另一个项目,或者另一个Service 或其他任何东西。看起来 OP 已经发现了他的问题,并且与这个答案无关。这个答案只会让其他寻求帮助的开发人员感到困惑。我建议您要么删除此答案,要么至少对其进行编辑,以明确答案不正确。
    猜你喜欢
    • 2020-04-25
    • 1970-01-01
    • 1970-01-01
    • 2015-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多