【问题标题】:PendingIntent does not invoke BroadcastReceiver of killed processPendingIntent 不调用被杀死进程的 BroadcastReceiver
【发布时间】:2013-05-24 09:04:56
【问题描述】:

我目前正在开发一个使用 IntentService 的应用程序,该应用程序会执行一些工作,然后设置 PendingIntent 以在某个指定时间唤醒自己。 p>

我的问题是,如果进程被杀死,则不会调用相应的 static BroadcastReceiver,但如果我 - 例如 - 设置 "android.intent.action.AIRPLANE_MODE " 在我的清单中的意图过滤器中。

为了杀死应用程序,我在 HTC Desire (2.3.7 CyanogenMod 7.2.0.1) 上长按后退按钮;)

这是我的清单:

<receiver
        android:name="com.jdev.myapp.service.MyReceiver"
        android:exported="false" >

        <intent-filter> <action android:name="android.intent.action.AIRPLANE_MODE" /> </intent-filter>

        //Just Used as an example

        <intent-filter> <action android:name="com.jdev.myapp.REINITIALIZATION" /> </intent-filter>
        <intent-filter> <action android:name="com.jdev.myapp.PROFILE_ENGAGED" /> </intent-filter>
        <intent-filter> <action android:name="com.jdev.myapp.PROFILE_DISENGAGED" /> </intent-filter>

        //Some more custom Actions here

        <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter>
        <intent-filter>
            <action android:name="android.intent.action.PACKAGE_REPLACED" />
            <data
                android:path="com.jdev.myapp"
                android:scheme="package" />

        </intent-filter>
    </receiver>

我这样创建我的 PendingIntents:

int Id;

Intent engaged = new Intent(Constants.PROFILE_ENGAGED);
//put some Extra

PendingIntent pi = PendingIntent.getBroadcast(getBaseContext(), Id, engaged, PendingIntent.FLAG_UPDATE_CURRENT);

之后我使用 AlarmManager 在计算的时间设置它...

只要进程处于活动状态,整个应用程序就会运行良好。但是如果进程被杀死 - 这实际上不应该是一个问题,因为广播接收器只需要再次启动服务,接收器不会被调用,但正如上面提到的那样,系统的东西像 "android.intent.action. AIRPLANE_MODE".

根据文档,它实际上应该可以工作:

PendingIntent 本身只是对系统维护的令牌的引用,该令牌描述了用于检索它的原始数据。这意味着,即使它拥有的应用程序的进程被杀死,PendingIntent 本身仍可用于其他已被赋予它的进程。如果创建应用程序稍后重新检索相同类型的 PendingIntent(相同的操作、相同的 Intent 操作、数据、类别和组件以及相同的标志),它将接收表示相同令牌的 PendingIntent,如果它仍然有效,并且可以因此调用 cancel() 将其删除。

http://developer.android.com/reference/android/app/PendingIntent.html

有人能解决我的问题吗?

【问题讨论】:

  • 停止使用“长按我的 HTC Desire 上的后退按钮”。大概是在您的 ROM 模块中执行的任何操作都会取消您的警报计划。您可以通过检查 adb shell dumpsys alarm 的输出来确认这一点。
  • @CommonsWare 感谢您的提示。在 shell 中,我发现了大量的 facebook 警报,但没有人采取我的行动……实际上,这是我第一次使用 adb。我在清单中将我的应用程序设置为可调试,重新安装它,杀死它并在 shell 中启动你的命令 - 我错过了什么吗?还是有另一种“更清洁”的方式来模拟我的进程的终止?除此之外,我还尝试使用第二个应用程序来捕获 Intent,该应用程序在发送应用程序处于活动状态的过程中也有效......
  • “或者有没有替代的、“更干净”的方式来模拟我的进程被杀死? -- 使用 DDMS。在“设备”选项卡中突出显示您的进程,然后单击停止按钮。
  • @CommonsWare 使用 DDMS 模拟杀戮,BroadcastReceiver 被调用! :) 我猜你的假设是对的,我会添加它作为答案;)

标签: android process broadcastreceiver android-pendingintent


【解决方案1】:

正如 CommonsWare 指出的那样,杀死这样的进程

为了杀死应用程序,我长按了 HTC Desire (2.3.7 CyanogenMod 7.2.0.1) 上的后退按钮

似乎非常具有破坏性,因为它也 - 在我的情况下 - 显然删除了与我的应用程序连接的警报,这不是故意的。

模拟你的进程被杀死使用

DDMS => 突出显示您的应用程序的进程 => 点击 STOP

【讨论】:

    【解决方案2】:

    这是按预期工作的——您使用的特定 Cyanogenmod 用户界面相当于进入设置/应用程序/[详细应用程序信息]并点击“强制停止”按钮。这会将应用程序恢复到刚刚安装的状态,并且在该状态下,如果没有一些直接的用户交互,则不允许应用程序运行。像这样“停止”的应用故意不接收广播。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-08
      • 1970-01-01
      • 1970-01-01
      • 2017-01-23
      • 2013-01-16
      相关资源
      最近更新 更多