2013-07-09 38 views
0

我试图在启动时设置警报,并通过AlarmManager定期调用IntentService。 AlarmReceiver从不被触发,不知道为什么。在启动时启动警报以调用IntentService

BootReceiver:

package com.company.android; 

import android.app.AlarmManager; 
import android.app.PendingIntent; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.util.Log; 
import android.text.format.Time; 

public class BootBroadcastReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Time now = new Time(); 
     now.setToNow(); 

     Log.e("#######################COMM", "Booting up " + now.toString()); 

     Intent alarmIntent = new Intent("com.company.android.AlarmReceiver"); 
     PendingIntent pi = PendingIntent.getBroadcast(context, 0, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT); 

     AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
     am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, System.currentTimeMillis(), 1000 * 5, pi); 

     Log.e("#######################COMM", "Booted up " + now.toString()); 
    } 
} 

AlarmReceiver:

package com.company.android; 

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.util.Log; 
import android.widget.Toast; 

/** 
* Created by mlaino on 7/8/13. 
*/ 
public class AlarmReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Log.d("COMM", "Pre"); 


     Intent i = new Intent("com.company.android.PollingService"); 
     context.startService(i); 

     Log.d("COMM","Pos"); 

    } 
} 

清单:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.company.android" android:versionCode="1" android:versionName="1.0-SNAPSHOT"> 
    <uses-sdk 
      android:minSdkVersion="14" 
      android:targetSdkVersion="15" /> 
    <application android:icon="@drawable/icon" android:label="@string/app_name"> 
    <receiver android:name=".BootBroadcastReceiver" 
      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> 
     <receiver android:name=".AlarmReceiver"> 
      <intent-filter> 
       <action android:name="com.company.android.AlarmReceiver" /> 
      </intent-filter> 
     </receiver> 

     <activity android:name=".CommunicationsManagerActivity"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <service android:name=".PollingService" > 
      <intent-filter> 
       <action android:name="com.company.android.PollingService" /> 
      </intent-filter> 
     </service> 
    </application> 

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

任何线索?

感谢

回答

1

首先,去除android:permission="android.permission.RECEIVE_BOOT_COMPLETED",如你所说,无论是调用接收机必须持有该权限,这可能会或可能不会是这样。

然后,请务必在重新启动之前运行其中一个活动,因为清单注册的BraodcastReceivers不会运行,直到明确运行某个组件(通常由用户启动活动来完成)为止。

+0

好的,所以注册广播接收器来接收警报,然后调用我的IntentService的唯一方法是首先运行一个活动?别无退路? (由于无知,我试图在BootBroadcastReceiver中启动时注册AlarmReceiver,并得到一个运行时异常)。该权限设置在该接收器上,以便它可以接收启动消息:) –

+2

@SoManyGoblins:“没有其他办法?” - 正确。这是为了防止恶意软件驱动。您可以通过http://commonsware.com/blog/2011/07/13/boot-completed-regression-confirmed.html和http://developer.android.com/sdk/android-3.1.html阅读更多信息。 #launchcontrols – CommonsWare

+0

好的!非常感谢你的澄清,并阅读材料:) –