3 votes

Comment exécuter un service en arrière-plan après avoir mis à jour l'application ?

J'ai une application d'alarme et j'ai remarqué que lorsque je mets à jour/réinstalle l'application, les intentions d'alarme en attente sont supprimées. J'ai donc besoin d'un moyen de détecter que l'application est mise à jour, sans que l'utilisateur ne lance l'application.

J'utilise les diffusions pour détecter les redémarrages du téléphone afin de réenregistrer mes alarmes, mais je ne sais pas comment détecter la mise à jour de l'application.

Par exemple, existe-t-il un moyen de lancer un service dès que l'application est installée, sans que l'utilisateur ouvre l'application ?

Je les ai vérifiés mais il semble que ce ne soit pas possible. Mais je me demande s'il existe une mise à jour pour les nouvelles versions d'Android :

Démarrer un service automatiquement lorsque l'application est installée sur l'appareil

Comment démarrer un service lorsque le fichier .apk est installé pour la première fois ?

Gracias.

3voto

Qandil Tariq Points 380

Plutôt que de mettre en place une alarme, disposez d'un BroadcastReceiver enregistré dans un Manifeste spécialement conçu à cet effet. Il peut soit écouter Android.intent.action.PACKAGE_REPLACED (remarque : le mot action est absent de cette constante), soit Android.intent.action.MY_PACKAGE_REPLACED.

<receiver android:name="...">
    <intent-filter>
        <action android:name="android.intent.action.PACKAGE_REPLACED"></action>
        <data android:scheme="package" android:path="com.your.package" /> 
    </intent-filter>
</receiver>

Après la réinstallation, votre récepteur recevra ce message et vous pourrez lancer une activité.

1voto

Android Geek Points 4110

Essayez ceci :

Mais tout d'abord, définissons le BroadcastReceiver qui sera exécuté par l'alarme et qui lancera notre IntentService :

public class MyAlarmReceiver extends BroadcastReceiver {
public static final int REQUEST_CODE = 12345;
public static final String ACTION = "com.codepath.example.servicesdemo.alarm";

 // Triggered by the Alarm periodically (starts the service to run task)
 @Override
 public void onReceive(Context context, Intent intent) {
Intent i = new Intent(context, MyTestService.class);
i.putExtra("foo", "bar");
context.startService(i);
 }
 }

Ensuite, enregistrons notre IntentService et MyAlarmReceiver dans le fichier AndroidManifest.xml.

<receiver
android:name=".MyAlarmReceiver"
android:process=":remote" >
</receiver>

<service
android:name=".MyTestService"
android:exported="false" />

activité java

public class MainActivity extends Activity {
@Override
 protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
scheduleAlarm();
 }

// Setup a recurring alarm every half hour
 public void scheduleAlarm() {
 // Construct an intent that will execute the AlarmReceiver
 Intent intent = new Intent(getApplicationContext(), MyAlarmReceiver.class);
 // Create a PendingIntent to be triggered when the alarm goes off
 final PendingIntent pIntent = PendingIntent.getBroadcast(this, 
  MyAlarmReceiver.REQUEST_CODE,
    intent, PendingIntent.FLAG_UPDATE_CURRENT);
// Setup periodic alarm every every half hour from this point onwards
long firstMillis = System.currentTimeMillis(); // alarm is set right away
AlarmManager alarm = (AlarmManager) 
 this.getSystemService(Context.ALARM_SERVICE);
// First parameter is the type: ELAPSED_REALTIME, ELAPSED_REALTIME_WAKEUP, 
 RTC_WAKEUP
// Interval can be INTERVAL_FIFTEEN_MINUTES, INTERVAL_HALF_HOUR, 
 INTERVAL_HOUR, INTERVAL_DAY
alarm.setInexactRepeating(AlarmManager.RTC_WAKEUP, firstMillis,
    AlarmManager.INTERVAL_HALF_HOUR, pIntent);
   }
   }

Après avoir réglé une alarme, si on veut l'annuler, comme ceci :

public void cancelAlarm() {
Intent intent = new Intent(getApplicationContext(), MyAlarmReceiver.class);
final PendingIntent pIntent = PendingIntent.getBroadcast(this, MyAlarmReceiver.REQUEST_CODE,
   intent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarm = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
alarm.cancel(pIntent);
 }

Et vérifiez les permissions de votre manifeste :

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

Je ne suis pas sûr mais s'il vous plaît vérifier mon être il vous aide

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X