Ne peut pas garder android vivant après l'application est fermée
Je suis en train de frayer un service qui reste actif tout le temps, même si l'utilisateur ferme l'application. Selon ces fils
Gardez le service de localisation vivant lorsque l'application est fermée
Android Service S'Arrête Quand L'Application Est Fermée
Android: maintenir les Services en cours d'exécution lorsque l'app est tué
ceci peut être accompli avec IntentServices ou d'un Service.START_STICKY
Pourtant, j'ai essayé les deux types de services, sans succès. En d'autres mots, mes services sont tués lorsque l'application est fermée par l'utilisateur. Quelqu'un peut-il point si ce n'est peut être fait et comment le faire? Voici ce que j'ai essayé sans succès:
Avec IntentService:
public class MyIntentService extends IntentService {
private final int mPollingTimeMS = 500;
private int mInitializationPollingCount = 0;
private Thread mPollThread;
public MyIntentService() {
super("MyIntentService");
}
@Override
protected void onHandleIntent(Intent intent) {
mPollThread = new Thread() {
public void run() {
while (true) {
try {
Log.e(Constants.Engine.LOGGER_TAG_DEV,
"SDK Service Running: " +
mInitializationPollingCount * mPollingTimeMS +
"ms have elapsed");
mInitializationPollingCount++;
sleep(mPollingTimeMS);
} catch (Exception e) {
StackTraceElement trace = new Exception().getStackTrace()[0];
Logger.e(Constants.Engine.LOGGER_TAG_APP, "[Exception:" + e.toString() + "]" +
trace.getClassName() + "->" + trace.getMethodName() + ":" + trace.getLineNumber());
}
}
}
};
mPollThread.start();
}
}
et avec des Services:
public class MyService extends Service {
public MyService() {
}
private final int mPollingTimeMS = 500;
private int mInitializationPollingCount = 0;
private Thread mPollThread;
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
mPollThread = new Thread() {
public void run() {
while (true) {
try {
Log.e(Constants.Engine.LOGGER_TAG_DEV,
"SDK Service Running: " +
mInitializationPollingCount * mPollingTimeMS +
"ms have elapsed");
mInitializationPollingCount++;
sleep(mPollingTimeMS);
} catch (Exception e) {
StackTraceElement trace = new Exception().getStackTrace()[0];
Logger.e(Constants.Engine.LOGGER_TAG_APP, "[Exception:" + e.toString() + "]" +
trace.getClassName() + "->" + trace.getMethodName() + ":" + trace.getLineNumber());
}
}
}
};
mPollThread.start();
return Service.START_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
//I tried to return null here, but this
//service gets killed no matter what.
return null;
}
}
et voici le manifeste:
<service
android:name=".mycompany.MyService"
android:enabled="true"
android:exported="true"
android:process=":process1">
</service>
<service
android:name=".mycompany.MyIntentService"
android:process=":process2"
android:exported="false">
</service>
Je vais ajouter que je suis la fermeture de l'appli de test pas avec un bouton de fermeture, mais en utilisant le système d'exploitation Android app manager. Voir l'image ci-dessous
Enfin, le pilote de l'activité (pas beaucoup là-bas)
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent1 = new Intent(getBaseContext(), MyService.class);
startService(intent1);
Intent intent2 = new Intent(getBaseContext(), MyIntentService.class);
startService(intent2);
}
}
J'ai aussi essayer d'ajouter un avis et d'en faire un de premier plan de services, mais toujours la même chose. Le moment où j'ai fermer l'application, tout se fait tuer. C'est ce que j'ai ajouté:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
showNotification();
...etc..
private void showNotification() {
Intent notificationIntent = new Intent(this, MainActivity.class);
notificationIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
notificationIntent, 0);
int iconId = R.mipmap.ic_launcher;
int uniqueCode = new Random().nextInt(Integer.MAX_VALUE);
Notification notification = new NotificationCompat.Builder(this)
.setSmallIcon(iconId)
.setContentText("Context Text")
.setContentIntent(pendingIntent).build();
startForeground(uniqueCode, notification);
}
- Parfois, si vous êtes faible sur la mémoire, le service s'arrête indépendamment. Essayez de faire comme un de premier plan de services si vous en avez besoin persistant, vous pouvez le faire par une notification et d'appeler le service. Beaucoup de documentation autour de.
- Je doute que ce soit le problème. Le téléphone fonctionne avec une seule application, et ça s'arrête les services.
- vous ne voulez pas un intentservice pour cette
Vous devez vous connecter pour publier un commentaire.
Voici un exemple de premier plan de service que j'utilise et qui fonctionne, il reste actif lorsque l'application est fermée. Bien sûr, il doit aussi être commencé, et pour cette tâche l'application doit être en cours d'exécution au premier coup d'oeil, ou un récepteur de démarrage de l'événement doit être réglé, mais ceci est une autre histoire.
Puis je le lance avec
Veuillez noter que les deux constantes utilisées comme des Actions, ce sont des Chaînes de caractères qui doit commencer par le nom du package.
IntentService
À l'aide de
IntentService
est probablement pas la meilleure approche. Par défautIntentService
s'arrête de lui-même aprèsonHandleIntent(Intent)
retourne et il n'y a pas de travail reste à faire (c'est à dire la demande de la file d'attente est vide). C'est expliqué dans le officiel docs de IntentService:Dans votre cas,
onHandleIntent(Intent)
crée un thread, mais revient tout de suite, ce qui en fait arrêter par lui-même.Service + startForeground()
Utilisant un
Service
en mode de premier plan devrait fonctionner aussi longtemps que vous le garder que de service en cours d'exécution sur un processus distinct. Pour cela, vous devez:onStartCommand()
retourSTART_STICKY
.onCreate()
.android:process=":something"
).Basée sur le post, il semble que vous avez essayé certaines de ces étapes dans l'isolement, mais jamais essayé tous en même temps.
Vous pouvez simplement appeler votre service dans votre onStop() la méthode à l'intérieur de votre activité.
Même lorsque l'utilisateur arrête l'application à laquelle le service sera toujours en cours d'exécution.
Si aucun des réponses ci-dessus sont de travail, peut-être que c'est un fabricant problème spécifique. Certains MI téléphones portables, par exemple, de tuer le premier plan de service lorsque l'utilisateur tuer l'application via le gestionnaire des tâches.
Je vous recommande de tester l'application sur un périphérique virtuel, de sorte que vous pouvez vérifier si elle est ou n'est pas ce genre de problème.
Espère que cela aide!