android - Android 3.1+ 中的 BroadcastReceiver 问题

标签 android android-intent android-manifest android-3.0-honeycomb android-service

我正在尝试使用 BroadcastReceiverService 将位置数据更新到 Web 数据库。

但是我在 Galaxy Tab 7.0 Plus 上使用 Android 3.2 时遇到了困难。

同一应用程序在 Android 2.3.6 Galaxy Note 上运行良好,但无法在平板电脑上运行。事实上,我将 RECEIVE_BOOT Intent 操作添加到我的接收器,但它永远不会被实例化,也就是说,onReceive() 永远不会在启动完成后被调用。我想知道是否有任何系统更新导致此操作。

这是我的 xml 和接收器类:

AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.tests.bootreceiver"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
    android:minSdkVersion="10"
    android:targetSdkVersion="15" />

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.INTERNET" />

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" >
    <receiver
        android:name=".BootUpReceiver"
        android:enabled="true"
        android:permission="android.permission.RECEIVE_BOOT_COMPLETED" >
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </receiver>

    <service android:name=".MyService" >
    </service>
</application>

BootUpReceiver.java

public class BootUpReceiver extends BroadcastReceiver {

private static int INTERVAL = 1000*15;

@Override
public void onReceive(Context context, Intent intent) {     
    AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    PendingIntent pi = PendingIntent.getService(context, 0, new Intent(context, MyService.class), PendingIntent.FLAG_UPDATE_CURRENT);
    am.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), INTERVAL, pi);
}

是否存在同一段代码在一个系统中工作而在另一个系统中不工作的原因?

谢谢!

最佳答案

自 android 3 起,应用程序中的所有组件都无法运行(接收广播),直到用户明确启动该应用程序。

要测试这是否是您的问题,请向您的应用程序添加一个虚拟 Activity 并启动它。现在您的应用程序应该能够从那时起接收 Intent (即使在重新启动后)。

这是描述问题的 AOSP 问题,

http://code.google.com/p/android/issues/detail?id=18225

请注意,它已关闭为“按预期工作”。这在技术上是一个安全修复程序。应用程序可以利用某些众所周知的广播 Intent (例如 TIMER_TICK)在用户从未运行该应用程序或不知道该应用程序正在运行的情况下自行启动。

关于android - Android 3.1+ 中的 BroadcastReceiver 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11744426/

相关文章:

android - 在重新启动期间保持 "lights-out"模式 (View.setSystemUiVisibility)

android - Intent.ACTION_VIEW 视频网址不适用于 Ice Cream Sandwich

java - 如何强制我的 android 应用程序仅以 RTL 布局方向运行?

Android + XAMARIN + 强制屏幕停留在 "Portrait"模式(使用 AndroidManifest)

android - 恢复 Top Activity 而不是启动 Launcher Activity

安卓 Facebook 登录 : How to check login using LoginManager without having LoginButton in XML

android - 如何使用 PreciseCallState

android - 设置宽度以匹配 ConstraintLayout 中的约束

android - Camera Intent 创建空图片

android - onActivityResult 正在调用而没有完成结果的调用 Activity