【问题标题】:Can't fix IntentService for notification with AlarmManager无法修复 IntentService 以使用 AlarmManager 进行通知
【发布时间】:2016-10-22 08:01:44
【问题描述】:

我正在尝试这样处理:在BroadcastReceiver 开始AlarmManager 重复操作时,它将向IntentService 发送意图,服务写入日志。现在,正如我从日志中看到的,BroadcastReceiver 收到意图,启动 AlarmManager,但 IntentService 永远不会触发。这里有什么问题?

清单:

<receiver android:name=".wakefullBroadcastReciever.SimpleWakefulReciever" android:enabled="true" android:exported="false">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
                <action android:name="START"/>
            </intent-filter>
        </receiver>

        <service
            android:name=".wakefulService.NotificationWakefulIntentService"
            android:enabled="true">
            <intent-filter>
                <action android:name="NOTIFY_INTENT" />
            </intent-filter>
        </service>

WakefulReciever:

public class SimpleWakefulReciever extends WakefulBroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        if (!App.isRunning) {
            Log.d("wakefull", "start");
            Intent startIntent = new Intent(context, NotificationWakefulIntentService.class);
            startIntent.setAction(Utils.NOTIFY_INTENT);
            PendingIntent startPIntent = PendingIntent.getBroadcast(context, 0, startIntent, 0);
            AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
            am.setRepeating(AlarmManager.RTC_WAKEUP,
                    SystemClock.elapsedRealtime() + 3000, 5000, startPIntent);
            App.isRunning = true;
        }
    }
}

意图服务:

public class NotificationWakefulIntentService extends IntentService {

    public NotificationWakefulIntentService() {
        super("NotificationWakefulIntentService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        Log.d("time",(System.currentTimeMillis()/1000)+"");
    }
}

【问题讨论】:

    标签: android android-intent android-pendingintent android-broadcastreceiver android-intentservice


    【解决方案1】:

    你定义了一个显式的ServiceIntent,但是调用getBroadcast()而不是getService()

    更改以下内容:

    PendingIntent startPIntent = PendingIntent
        .getBroadcast(context, 0, startIntent, 0);
    

    到这里:

    PendingIntent startPIntent = PendingIntent
        .getService(context, 0, startIntent, 0);
    

    另外,WakefulBroadcastReceiver 不是这样工作的。它是一个辅助类,它的目的是提供一个WakeLock,直到你的Service 完成它的工作。

    通过简单地扩展WakefulBroadcastReceiver,您一无所获,无论如何,WakeLockonReceive() 期间得到保证。

    在下面回答您的评论:

    你应该设置一个准确的警报,每小时触发一次(查看this answer),通过调用onReceive()onReceive()开始你的IntentService,在onHandleIntent()做你的事情并在完成后调用WakefulBroadcastReceiver.completeWakefulIntent() .

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-04
      相关资源
      最近更新 更多