Je souhaite exécuter mon application en arrière-plan si je tue également l'instance de l'application. Mais après avoir tué mon application, le service cesse également de fonctionner. Voici mon code s'il vous plaît, aidez-moi à résoudre mon problème.
J'ai suivi ce lien pour une exécution en arrière-plan, mais cela ne fonctionne pas si je supprime l'instance. S'il vous plaît, quelqu'un peut-il me montrer comment exécuter un service en arrière-plan si l'instance est également supprimée?
Ceci est mon activité principale
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ctx = this;
setContentView(R.layout.activity_main);
Intent alarmIntent = new Intent(MainActivity.this, AlarmReceiver.class);
pendingIntent = PendingIntent.getBroadcast(MainActivity.this, ALARM_REQUEST_CODE, alarmIntent, 0);
mSensorService = new SensorService(getCtx());
mServiceIntent = new Intent(getCtx(), mSensorService.getClass());
if (!isMyServiceRunning(mSensorService.getClass())) {
startService(mServiceIntent);
}
}
C'est ma classe de service
public class SensorService extends Service{
public int counter=0;
public SensorService(Context applicationContext) {
super();
Log.i("HERE", "here I am!");
}
public SensorService() {
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
super.onStartCommand(intent, flags, startId);
startTimer();
return START_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
Log.i("EXIT", "ondestroy!");
Intent broadcastIntent = new Intent("uk.ac.shef.Oak.ActivityRecognition.RestartSensor");
sendBroadcast(broadcastIntent);
}
private Timer timer;
private TimerTask timerTask;
long oldTime=0;
public void startTimer() {
//set a new Timer
timer = new Timer();
//initialize the TimerTask's job
initializeTimerTask();
//schedule the timer, to wake up every 1 second
timer.schedule(timerTask, 1000, 1000); //
}
/**
* it sets the timer to print the counter every x seconds
*/
public void initializeTimerTask() {
timerTask = new TimerTask() {
public void run() {
Log.i("in timer", "in timer ++++ "+ (counter++));
}
};
}
/**
* not needed
*/
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
C'est une longue histoire . J'ai traversé ça. Toujours mis en œuvre. Maintenant, mon service s'exécute sur chaque événement boot_complete et continue à fonctionner tout le temps (avec une notification).
Big NO. La documentation destinée aux développeurs de Google Android est médiocre et ne contient pas non plus d'exemple approprié. C'est théorique et juste théorique. Continuez à lire si intéressé
https://developer.Android.com/about/versions/oreo/background
Synopsis 1: Vous ne pouvez recevoir que BOOT_COMPLETE
et seulement quelques émissions dans le récepteur traditionnel. Restez tous les récepteurs de diffusion dont vous avez besoin pour implémenter le runtime dans un service en les enregistrant via un code du service qui s'exécute toujours.
Synopsis 2: Encore une fois, vous ne pouvez pas toujours avoir des processus en cours d'exécution supérieurs ou égaux à 8.0 (Oreo) ... Pour obtenir un processus toujours identique ... Créez une Intentservice
avec notification appropriée de type ongoing
et de OnStartCommand
START_STICKY
et d'inscrire le destinataire avec le code dans OnCreate
Comment l'implémenter: Je l'ai implémenté, prenez référence à partir d'ici: Oreo: Récepteur de diffusion Ne fonctionne pas
Maintenant, votre question: je veux exécuter mon application en arrière-plan si je tue également l'instance d'application .
Avec l'aide du lien ci-dessus de ma mise en œuvre, vous pouvez le réaliser
*Termes et conditions
Votre système d'exploitation doit avoir le système d'exploitation Android approprié publié et gravé tel quel.
Oui, j'utilise Android:
No... You are Using Funtouch OS : VIVO ( By modifying Android)
COLOR OS comprend de nombreux appareils: OPPO (En modifiant Android) .... ....
to allow only selective applications run in background
Comme WhatsApp
, Facebook
, Google
Twitter
Instagram
Maintenant, vous allez poser une question aux développeurs Si ces applications fonctionnent en arrière-plan, je peux les exécuter en arrière-plan aussi ....
Non ... Ce sont des modifications basées sur le système d'exploitation permettant de vérifier si un service provient de fournisseurs autorisés, il est le seul à pouvoir y être actif en arrière-plan. S'ils refusent ces fournisseurs, personne ne prend de téléphones qui n'exécutent pas ces fameuses applications sociales.
Hushhhhhhhh .......
nouveau Concept PIP (mode Image dans Image) et contrôle des catégories de services en créant des canaux et leur priorité. Vous devez modifier le code uniquement pour oreo afin de créer des notifications et des services.
lisez attentivement la documentation destinée aux développeurs google ici. https://developer.Android.com/guide/topics/ui/notifiers/notifications Les codes Java et Kotlin sont disponibles ici pour créer notification dans oreo
https://developer.Android.com/training/notify-user/build-notification
c'était mon effort pour trouver la solution après avoir cherché et partagé avec vous.
voici un exemple de code:
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this, CHANNEL_ID)
.setSmallIcon(R.drawable.notification_icon)
.setContentTitle("My notification")
.setContentText("Much longer text that cannot fit one line...")
.setStyle(new NotificationCompat.BigTextStyle()
.bigText("Much longer text that cannot fit one line..."))
.setPriority(NotificationCompat.PRIORITY_DEFAULT);
pour créer des canaux, écrivez ce code:
private void createNotificationChannel() {
// Create the NotificationChannel, but only on API 26+ because
// the NotificationChannel class is new and not in the support library
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
CharSequence name = getString(R.string.channel_name);
String description = getString(R.string.channel_description);
int importance = NotificationManager.IMPORTANCE_DEFAULT;
NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance);
channel.setDescription(description);
// Register the channel with the system; you can't change the importance
// or other notification behaviors after this
NotificationManager notificationManager = getSystemService(NotificationManager.class);
notificationManager.createNotificationChannel(channel);
}
}
vous pouvez voir les détails complets des notifications Push et de l'envoi de messages en cliquant sur les liens ci-dessus.
Vous devez créer ForegroundService afin de poursuivre le traitement lorsque votre application est supprimée, comme suit:
public class SensorService extends Service{
...
private PowerManager.WakeLock wakeLock;
@Override
public void onCreate() {
super.onCreate();
...
//wake lock is need to keep timer alive when device goes to sleep mode
final PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "PARTIAL_WAKE_LOCK_TAG");
createNotificationChannel(this);
Notification notification = new NotificationCompat.Builder(this, "NOTIFICATION_CHANNEL").setSmallIcon
(<icon>).setContentTitle("Title")
.setContentText("Content").build();
startForeground(1001, notification);
}
...
@Override
public void onDestroy() {
super.onDestroy();
if (wakeLock.isHeld()) {
wakeLock.release();
}
...
}
public void createNotificationChannel() {
// Create the NotificationChannel, but only on API 26+ because
// the NotificationChannel class is new and not in the support library
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
CharSequence name = "Channel name";
String description = "Description";
int importance = NotificationManager.IMPORTANCE_DEFAULT;
NotificationChannel channel = new NotificationChannel("NOTIFICATION_CHANNEL", name, importance);
channel.setDescription(description);
NotificationManager notificationManager = getApplicationContext().getSystemService(NotificationManager.class);
notificationManager.createNotificationChannel(channel);
}
}
...
}
Pour démarrer le service:
Intent i = new Intent(context, SensorService.class);
ContextCompat.startForegroundService(context, i)
Remarque:
stopSelf()
lorsque votre tâche de minuterie a été exécutée avec succès.