2016-07-18 4 views
0

Ich habe in dieser Situation für eine lange Zeit stecken geblieben ...Alarm Manager werden nicht funktionieren, wenn die App im Hintergrund getötet und Gerät gesperrt ist

Ich mag den Alarmmanager verwenden, um Benachrichtigungen zu zeigen, bei die spezifische Zeit, und jetzt hat es in der folgenden Situation funktioniert:

  1. Wenn die App im Hintergrund ausgeführt wird, wird die Benachrichtigung zur richtigen Zeit angezeigt, und egal, das Gerät gesperrt ist oder nicht.
  2. nachdem die App im Hintergrund getötet wurde, werde ich immer noch korrekte Benachrichtigung erhalten, wenn das Gerät nicht gesperrt ist, aber Dinge werden falsch, wenn das Gerät gesperrt ist, kann ich keine Benachrichtigung erhalten.

    @Override 
    public void onReceive(Context context, Intent intent) { 
        WakeLocker.acquire(context); 
    
        String action = intent.getAction(); 
    
        Log.d(TAG, action); //when app is killed and device is locked, no info is shown at the logcat 
    
        if (ACTION_ALARM.equals(action)) { 
         Vibrator vibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE); 
         vibrator.vibrate(2 * 1000); 
    
         notify(context, "Jello!"); 
        } 
    
        WakeLocker.release(); 
    } 
    
    public static void alarm(Context context) { 
        AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
        Intent intent = new Intent(context, AlarmReceiver.class); 
        intent.setAction(ACTION_ALARM); 
        PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0); 
    
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
         alarmManager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 5 * 1000, pi); 
        } else { 
         alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 5 * 1000, pi); 
        } 
    } 
    
    private void notify(Context context, String msg) { 
        NotificationManager notificationManager = (NotificationManager) 
          context.getSystemService(Context.NOTIFICATION_SERVICE); 
    
        PendingIntent contentIntent = PendingIntent.getActivity(context, 0, 
          new Intent(context, InfoActivity.class), 0); 
    
        Notification notification = 
          new NotificationCompat.Builder(context) 
            .setSmallIcon(R.mipmap.ic_launcher) 
            .setContentTitle(context.getString(R.string.alarm)) 
            .setStyle(new NotificationCompat.BigTextStyle().bigText(msg)) 
            .setContentText(msg) 
            .setAutoCancel(true) 
            .setContentIntent(contentIntent).build(); 
    
        notificationManager.notify(1, notification); 
    } 
    

    Berechtigungen hinzugefügt:

Hier den Code AlarmReceiver.java, alle benötigten Erlaubnis in AndroidManifest.xml wurde bereits hinzugefügt

<uses-permission android:name="android.permission.WAKE_LOCK"/> 
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/> 
<uses-permission android:name="android.permission.VIBRATE"/> 
+0

Haben Sie die richtigen Berechtigungen festgelegt? – NilayDani

Antwort

0

Ich habe gerade die Lösung gesetzt Flag namens FLAG_INCLUDE_STOPPED_PACKAGES auf Vorsatz des Alarms wird die Dinge richtig gehen. Hier sind die Illustrationen in Android Developers

+0

Dies wird keinen Unterschied machen seit "Dies ist das Standardverhalten, wenn FLAG_EXCLUDE_STOPPED_PACKAGES nicht festgelegt ist", da der Link, auf den Sie verweisen, sagt ... –

0

ich eines Tages ein ähnliches Problem hatte und fand online eine Lösung, die das Telefon beim Aufruf des Broadcast-Receivers wakelte. Versuchen Sie also, diese Klasse zu erstellen, und rufen Sie MyWakeLock.acquire() auf, wenn der Broadcastempfänger aufgerufen wird. Sie sollten auch MyWakeLock.release() anrufen, wenn Sie mit der Ausführung Ihres Alarms fertig sind.

package your.package.name; 

import android.content.Context; 
import android.os.PowerManager; 

public abstract class MyWakeLock { 
    private static PowerManager.WakeLock wakeLock; 

    public static void acquire(Context c) { 
     if (wakeLock != null) wakeLock.release(); 

     PowerManager pm = (PowerManager) c.getSystemService(Context.POWER_SERVICE); 
     wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | 
       PowerManager.ACQUIRE_CAUSES_WAKEUP | 
       PowerManager.ON_AFTER_RELEASE, MainActivity.APP_TAG); 
     wakeLock.acquire(); 
    } 

    public static void release() { 
     if (wakeLock != null){ 
      wakeLock.release(); 
     } 
     wakeLock = null; 
    } 
} 
+0

Ich habe diese Klasse bereits erstellt und Wakelock in onReceive() -Methode erwerben, aber es funktioniert immer noch nicht ... Ich habe mich gefragt, der Empfänger wird nicht ausgelöst, wenn App getötet wird und Gerät gesperrt ist – Guomato

+0

Sie haben Berechtigungsprobleme –

+0

Und ich gerade fand eine andere situation, dieser code funktioniert nicht auf meiner samsung s5 samsung, aber arbeitete an htc one x ... – Guomato

Verwandte Themen