-1

Ich möchte einige Netzwerkjob regelmäßig selbst wenn App, wenn Kraft geschlossen.Alarm Manager und Broadcast-Empfänger in Kraft geschlossen App

Jetzt funktioniert es, bis die Kraft geschlossen ist. Was ich vermisse?

Auch wenn ich dieses manifestieren hinzu: android: process = ": remote" - es ist nicht OnReceive Methode Auslösung (wie App Kraft ist geschlossen), aber in Protokollen fand ich, dass:

V/Alarmmanager: ausgelöst : cmp = com.cryptorulezz.cryptosignals/.Code.Alarm Pkg: com.cryptorulezz.cryptosignals

Mein Code:

public class Alarm extends BroadcastReceiver 
{ 
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); 
     PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, ""); 
     wl.acquire(); 

     // Put here YOUR code. 
     Toast.makeText(context, "Alarm !!!!!!!!!!", Toast.LENGTH_LONG).show(); // For example 
     System.out.println("ALARM !!!!!!!!!!!!!!!!!!!!"); 

     wl.release(); 
    } 

public void setAlarm(Context context) 
{ 
    AlarmManager am =(AlarmManager)context.getSystemService(Context.ALARM_SERVICE); 
    //Intent i = new Intent(context, Alarm.class); 
    Intent i = new Intent("Coinsider.START_ALARM"); 
    PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0); 
    am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * 60 * 1, pi); // Millisec * Second * Minute 
} 

    public void cancelAlarm(Context context) 
    { 
     Intent intent = new Intent(context, Alarm.class); 
     PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0); 
     AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
     alarmManager.cancel(sender); 
    } 
} 

Wie i Alarm in MainActivity gesetzt:

Alarm alarm = new Alarm(); 
alarm.setAlarm(this); 

Manifest:

<receiver android:name=".Code.Alarm" android:exported="false"> 
     <intent-filter> 
      <action android:name="Coinsider.START_ALARM" > 
      </action> 
     </intent-filter> 
    </receiver> 
+0

https://stackoverflow.com/a/39739886/3363481 – earthw0rmjim

+0

Wenn der Benutzer Ihre Anwendung zu verwenden, entscheidet nicht, wer bist du zu sagen, sie, dass sie falsch liegen? Ein Force Close ist eine manuelle Sache und Ihre App sollte nicht weiter funktionieren. –

+0

@RichardLeMesurier Einige Apps können Benachrichtigungen anzeigen, nachdem sie geschlossen wurden, und ich bin mir nicht sicher, ob es sich um Cloud-Messaging handelt. – Vadim

Antwort

0

Sobald die App Kraft getötet wird, wird es nicht die Absicht erhalten und die Intent-Filter wird nicht ausgelöst werden. Um dies zu überwinden, schlage ich eine Art von WatchDog vor, das auf einigen Systemereignissen beruht (wie android.intent.action.BOOT_COMPLETED), die einfach prüfen, ob einer Ihrer Prozesse am Leben ist, und falls nicht, wird er ausgelöst. In dem Manifest, Enden Sie haben so etwas wie dieses:

<receiver 
     android:name="it.angelic.receivers.WatchDogSetupReceiver" 
     android:process=":souliss_process"> 
     <intent-filter> 
      <action android:name="android.intent.action.BOOT_COMPLETED"/> 
      <action android:name="android.intent.action.USER_PRESENT"/> 
     </intent-filter> 
    </receiver> 

Die Klasse WatchDogSetupReceiver würde dann prüfen, ob der Hund am Leben ist, und ein neues Feuer, wenn nötig:

 Intent i = new Intent(ctx, WatchDogEventReceiver.class); // explicit intent 
     PendingIntent patTheDog = PendingIntent.getBroadcast(ctx, 0, i, PendingIntent.FLAG_CANCEL_CURRENT); 
     alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, now.getTimeInMillis(), 5000, 
       patTheDog); 

Last, würde WatchDogEventReceiver Führen Sie einfach den erforderlichen nicht killierbaren Job aus. Es ist wichtig, dass der Watchdog hell bleibt, da er bei jedem Event ausgelöst wird. Diese Lösung ist nicht optimal, sondern arbeitet auch nach dem Kraft-kill:

public class WatchDogEventReceiver extends BroadcastReceiver { 


@Override 
public void onReceive(final Context ctx, final Intent intent) { 
    Log.d(Constants.TAG + ":WatchDog", "WatchDog.onReceive() called, looking for Dataservice:"); 
    ActivityManager manager = (ActivityManager) ctx.getSystemService(Context.ACTIVITY_SERVICE); 
    //Fire Service 
    Intent eventService = new Intent(ctx, YourDamnService.class); 
    ctx.startService(eventService);//sempre, ci pensa poi lui 


} 
+0

Probieren Sie es aus, aber was ist SoulissDataService.class? – Vadim

+0

Es ist Code aus meiner eigenen App, nützlich, um den Ansatz zu erklären. Was ist unklar? Warum hast du? – Shine

+0

ist es nicht ich -1 ed – Vadim

Verwandte Themen