代码之家  ›  专栏  ›  技术社区  ›  Hunt

设备中未调用BOOT_COMPLETED

  •  5
  • Hunt  · 技术社区  · 11 年前

    我想在设备启动时启动一个alram,为此我做了以下工作

    1) 用户权限

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

    2) 在清单文件中添加具有意图操作的接收者

     <receiver
                android:name=".sms.BootReceiver"
                android:enabled="true" >
                <intent-filter>
                    <action android:name="android.intent.action.BOOT_COMPLETED" >
                    </action>
    
                    <category android:name="android.intent.category.DEFAULT" />
                </intent-filter>
            </receiver>
    

    3) 来源

    public class BootReceiver extends BroadcastReceiver {
    
        private AlarmManager dayAlarmMgr;
        private PendingIntent dayAlarmIntent;
        private NotificationManager mNotificationManager;
        private NotificationCompat.Builder builder;
        private Context context;
        public static final int NOTIFICATION_ID = 2;
    
        @Override
        public void onReceive(Context context, Intent intent) {
    
             if (intent.getAction().equals("android.intent.action.BOOT_COMPLETED")) {
                        Toast.makeText(context, "FIRED BOOT COMPLETE" , Toast.LENGTH_LONG).show();
               }
        }
    }
    

    以上代码在genymotion中工作,但在实际设备上不工作

    5 回复  |  直到 11 年前
        1
  •  4
  •   Hunt    11 年前

    谢谢你的帮助,但最终我还是成功了 android.intent.action.BOOT_COMPLETED 通过设置 android:installLocation="internalOnly" 当应用程序启动完成时,存储在内部存储器中。

        2
  •  1
  •   Aldo    11 年前

    问题是 android:name=".sms.BootReceiver" ,应该是 android:name=".BootReceiver" 。但有些设备无法捕捉 BOOT_COMPLETED 你的 intent-filter 应如下所示:

    <intent-filter>
       <action android:name="android.intent.action.BOOT_COMPLETED" />
       <action android:name="android.intent.action.QUICKBOOT_POWERON" />
       <action android:name="com.htc.intent.action.QUICKBOOT_POWERON" />
    </intent-filter>
    

    别忘了编辑你的来源:

    if ((intent.getAction().equals("android.intent.action.BOOT_COMPLETED") 
       || intent.getAction().equals("android.intent.action.QUICKBOOT_POWERON")
       || intent.getAction().equals("com.htc.intent.action.QUICKBOOT_POWERON"))){
          Toast.makeText(context, "FIRED BOOT COMPLETE" , Toast.LENGTH_LONG).show();
    }
    
        3
  •  0
  •   khurram    11 年前
      android:name=".sms.BootReceiver"
    

    而不是那种用途

    android:name=".BootReceiver"
    

    android:name="complete.packagename.sms.BootReceiver"
    

    希望这能解决你的问题。

        4
  •  0
  •   PPD    11 年前

    确保您的应用程序中至少有一个活动。从Android 3.1开始,BroadcastReceiver将无法工作,直到用户手动启动一个活动,这是为了提供安全性。一旦用户第一次运行应用程序,那么您的BroadcastReceiver将始终运行,除非它不强制停止。一旦第一次启动活动,您的广播接收器将在重新启动设备后运行。

    在模拟器上,它正在工作-这可能是因为它在低于3.1的版本上运行,而真实设备在高于3.1的版本下运行

        5
  •  -1
  •   Raj Kumar Gupta    11 年前
    <receiver android:name="your.package.example.BootReceiver" >
                <intent-filter>
                    <action android:name="android.intent.action.BOOT_COMPLETED" />
                </intent-filter>
            </receiver>