2016-07-08 7 views
1

ich ein Android Wear App erstellen, und ich möchte diese App Benachrichtigung einige Male (In diesem Code, den ich meinen Dienst für die Erstellung Meldung alle 15 Minuten anrufen möchten) erstellenAlarmmanager nicht mein Service von Android Wear App rufen

Wenn Ich registriere meinen Dienst bei AlramManager, ich kann diese Aufgabe in OS erstellt sehen (adb shell dumpsys alarm > dump.txt), aber ich kann die Benachrichtigung oder das Protokoll nicht sehen, um den Dienstlauf zu beweisen. Ich teste meinen Dienst mit startService und sowohl die Benachrichtigung als auch das Protokoll funktionierten korrekt, also weiß ich nicht, wo das Problem ist. Hier sind die Codes verwende ich:

MyAlarmService.java

public class MyAlarmService extends Service { 
    @Override 
    public void onCreate() { 
     super.onCreate(); 
     Log.d("From serivce","Service run once"); 

     // Create notification 
     Context context = this; 
     NotificationCompat.Builder builder = new NotificationCompat.Builder(context); 
     builder.setContentTitle(context.getString(R.string.NotificationTitle)) 
      .setSmallIcon(R.mipmap.ic_launcher_hafez) 
      .setContentText("Some text"); 
     Notification secondPage = 
      new NotificationCompat.Builder(context) 
        .setContentTitle(context.getString(R.string.NotificationTitle)) 
        .setContentText("Some text") 
        .build(); 

     NotificationCompat.WearableExtender extender = new NotificationCompat.WearableExtender(); 
     extender.addPage(secondPage); 
     builder.extend(extender); 

     NotificationManagerCompat mgr = NotificationManagerCompat.from(context); 
     int NotificationId = new Random().nextInt(5200); 
     mgr.notify(NotificationId, builder.build()); 
    } 

    @Nullable 
    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 
} 

AndroidManifest.xml

... 
<service android:name=".MyAlarmService" /> 
... 

Der Code, den Dienst in Alarmmanager registrieren:

Context context = getActivity().getApplicationContext(); 
Calendar calendar = Calendar.getInstance(); 
calendar.setTimeInMillis(System.currentTimeMillis()); 
Intent intent = new Intent(context, MyAlarmService.class); 
PendingIntent alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0); 

AlarmManager alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 

alarmMgr.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 
       AlarmManager.INTERVAL_FIFTEEN_MINUTES, alarmIntent); 

Der Inhalt dump.txt

Current Alarm Manager state: 

... 

Batch{91609e num=3 start=7228838 end=7233540 flgs=0x8}: 

... 

    RTC_WAKEUP #0: Alarm{18a777f type 0 when 1467992333472 org.rashno.mypackagename} 

     tag=*walarm*:org.rashno.mypackagename/.MyAlarmService 

     type=0 whenElapsed=-6s582ms when=2016-07-08 20:08:53 

     window=+11m15s0ms repeatInterval=900000 count=0 flags=0x0 

     operation=PendingIntent{397c34c: PendingIntentRecord{de77f95 org.rashno.mypackagename broadcastIntent}} 

... 

    Alarm Stats: 
    ... 
    u0a57:org.rashno.mypackagename +9ms running, 1 wakeups: 

    +9ms 1 wakes 1 alarms, last -1m33s417ms: 

     *walarm*:org.rashno.mypackagename/.MyAlarmService 
    ... 
    ... 
+0

Ein Vorschlag (noch keine * Lösung *; ^): Versuchen Sie, den Dienst in Ihrem Manifest auf exported = "true" 'zu setzen. – String

+0

@String Ich versuche das, aber das Ergebnis ist das gleiche wie zuvor –

Antwort

1

Ein PendingIntent für einen Dienst sollte mit getService erstellt werden.

PendingIntent alarmIntent = PendingIntent.getService(context, 0, intent, 0); 
+0

Vielen Dank, das ist mein Problem gelöst. Ich kann dir das Kopfgeld erst in den nächsten 2 Stunden geben. –

+0

Wenn ich versuche, meinen AlarmManager zu wiederholen (über 'setRepeating' oder' set' es wieder in Betrieb), wird der Dienst nicht zum zweiten Mal ausgeführt. Weißt du, warum das passiert? –

+0

Wenn der Service bereits erstellt wurde, wird onCreate nicht erneut aufgerufen. Sie sollten entweder 'onStartCommand' verwenden oder auf' BroadcastReceiver' umschalten. – tachyonflux