2017-07-31 2 views
0

J'ai une application dont les fonctionnalités principales dépendent de l'alarme mais parfois l'alarme est déclenchée, je dis que c'est parce que le système tue votre application avant que l'alarme se déclenche en cas d'incendie, même après l'application tué, voici comment je réglage de l'alarmeComment faire pour déclencher des alarmes même si l'application est arrêtée par le système

public static void setEndAlarm(){ 
    AlarmManager alarmManager = (AlarmManager) MyApplication.getContext().getSystemService(Context.ALARM_SERVICE); 
    Calendar time = Calendar.getInstance(); 
    time.setTimeInMillis(System.currentTimeMillis()); 
    time.set(Calendar.HOUR_OF_DAY, SharedPrefUtils.getEndHour(MyApplication.getContext())); 
    time.set(Calendar.MINUTE, SharedPrefUtils.getEndMin(MyApplication.getContext())); 
    time.set(Calendar.SECOND, 0); 
    alarmManager.set(AlarmManager.RTC_WAKEUP, time.getTimeInMillis(), endPendingIntent(MyApplication.getContext())); 
} 

private static PendingIntent endPendingIntent(Context context){ 
    Intent intent = new Intent(context, ClsEndBroadcastReciever.class); 

    PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 02, intent, PendingIntent.FLAG_ONE_SHOT); 
    return pendingIntent; 
} 

et le contexte se présente comme suit:

public class MyApplication extends Application { 

private static Context mContext; 

@Override 
public void onCreate() { 
    super.onCreate(); 
    mContext = getApplicationContext(); 
} 

public static Context getContext() { 
    return mContext; 
} 
} 

diffusion récepteur:

public class ClsEndBroadcastReciever extends BroadcastReceiver { 
@Override 
public void onReceive(Context context, Intent intent) { 

    FirebaseJobDispatcher dispatcher = new 
FirebaseJobDispatcher(new GooglePlayDriver(context)); 

    dispatcher.cancel("notification"); 
    Toast.makeText(context, "End Time", Toast.LENGTH_SHORT).show(); 
} 
} 

Répondre

0

Je ne pense pas que vous pouvez le faire de manière fiable sans les autorisations du système.

Vous essayez d'utiliser IntentService et START_STICKY (https://developer.android.com/reference/android/app/Service.html) pour vous assurer que l'application n'est pas supprimée.

+0

Je pense que les services sont également tués, est-ce vrai – blackHawk

+0

Oui dans certains appareils comme oppp, vivo et beaucoup dispositif personnalisé Android similaire, si vous supprimez l'application de la barre des tâches (Glisser pour effacer), puis cette application ira à l'arrêt de la force qui fait que tous vos services à être tué. –

+0

Alors, comment puis-je assurer la fiabilité de mon application? – blackHawk

0

Si vous spécifiez votre BroadcastReceiver dans Manifest alors il sera appelé même si votre application n'est pas active écrire maintenant.

Manifest

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme"> 

    <!-- Activities and Services --> 

    <receiver android:name=".AlarmBroadcastReceiver"/> 

</application> 

AlarmBroadcastReceiver

public class AlarmBroadcastReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 

     // do what you want to do here. 
     // if the work load is heavy then launch service for it here 

    } 
} 
+0

Son dans le manifeste, le problème est que l'alarme tire parfois parfois pas – blackHawk

+0

@blackHawk alors pouvez-vous poster le code pour nous montrer comment vous définissez l'alarme? – Marat

+0

son se passe comme cette alarme tirant tous les jours après 5,6 jours si l'application n'est pas ouverte, il ne se déclenche pas, et si l'application ouvre ses feux comme d'habitude – blackHawk