Redémarrez le service même si app est arrêté de force et continuer à exécuter le service en arrière-plan, même après la fermeture de l'application Comment?

j'essaie d'exécuter un service en arrière-plan. Ce que fait mon application est quand l'utilisateur vérifie la case à cocher puis le service commence et quand il est non vérifié le service est arrêté. Qui fonctionne parfaitement bien. Mais le problème est que lorsque j'ai fermé l'application du Gestionnaire des tâches, il arrête également le service. Ce que je veux, c'est que le service continue de fonctionner même après qu'il soit proche du Gestionnaire des tâches. Alors la seule façon d'arrêter ce service est par l'utilisateur lui-même en décochant la boîte.

Comment puis-je - ils y parvenir?

Voici mon code

mon activité principale

public class SampleServiceActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    final CheckBox cb = (CheckBox) findViewById(R.id.checkBox1);

    cb.setOnCheckedChangeListener(new OnCheckedChangeListener() {
        public void onCheckedChanged(CompoundButton buttonView,
                boolean isChecked) {

            if(isChecked) {
                Toast.makeText(getBaseContext(), "Checked", Toast.LENGTH_LONG).show();
                startService(new Intent(getBaseContext(), MyService.class));
            } else {
                Toast.makeText(getBaseContext(), "Unchecked", Toast.LENGTH_LONG).show();
                stopService(new Intent(getBaseContext(), MyService.class));
            }
        }

    });
}
}

ma classe de service

public class MyService extends Service {
Notify n = new Notify();
@Override
public IBinder onBind(Intent arg0) {
    // TODO Auto-generated method stub
    return null;
}

public int onStartCommand(Intent intent, int flags, int startId) {
    Toast.makeText(this, "Service Started", Toast.LENGTH_LONG).show();
    n.initNotification(getBaseContext(), true);
    return START_STICKY;
}

//method to stop service
public void onDestroy() {
    super.onDestroy();
    n.cancelNotification(getBaseContext());
    Toast.makeText(this, "Service Stopped", Toast.LENGTH_LONG).show();
}
}

mise à Jour

Comment faire pour que ce service fonctionne comme gtalk service?

17
demandé sur Akhil 2012-05-20 11:04:10

8 réponses

Je ne suis pas sûr de savoir à quel "gestionnaire de tâches" vous vous référez car différents agiraient différemment, donc je Base ma réponse sur l'action lorsque l'utilisateur va aux Paramètres-->Gérer les Applications et--> force arrête l'application comme android lui a donné.

En supposant que votre service est en cours d'exécution dans le cadre du processus et si l'utilisateur force-arrête votre processus, vous êtes empêché de jamais exécuter le service à nouveau jusqu'à ce que l'utilisateur manuellement vous lance.Ceci est particulièrement valable à partir de la version 3.0 et plus (vérifiez pour la vôtre). Il semble également logique quand vous pensez qu'il ya une application qui maintient un service commencé tout le temps et est ennuyeux pour l'utilisateur d'une certaine façon. Ainsi, lorsque l'utilisateur commande un coup ( :) la force s'arrête sur l'app, il ne devrait pas redémarrer le service d'écoute à l'utilisateur.

par exemple, imaginez ce qui arriverait si vous pouviez créer des applications qui viennent de manger à l'Heure de votre processeur en tenant un verrou de veille, et vous ne pouviez pas les tuer. Ce serait horrible et un énorme désastre de sécurité.

ainsi, vous ne sera pas être en mesure de redémarrer votre service par n'importe quel moyen jusqu'à ce que l'utilisateur lance l'une de vos activités.

vous ne pouvez pas désactiver le bouton d'arrêt de force AFAIK. Vous devriez prendre le point de vue que rien sur l'appareil n'est sous votre contrôle à part votre application et (dans une mesure limitée) les ressources auxquelles vous avez accès.

finalement, même l'application gtalk se pliera à votre volonté si vous désirez forcer l'arrêt. Il ne démarre que lorsque vous utilisez Gtalk ou d'autres applications qui utilisent le service Gtalk comme PUSH Gmail ( pour les téléphones où gtalk ne fait pas partie du micrologiciel). Jetez également un oeil à Android C2DM ici:

https://stackoverflow.com/a/11238779/1218762

19
répondu Akhil 2017-05-23 12:10:11

mais le problème est que lorsque j'ai fermé l'application du Gestionnaire des tâches, il arrête également le service.

Correct.

ce que je veux, c'est que le service continue de fonctionner même après qu'il soit proche du Gestionnaire des tâches. Alors la seule façon d'arrêter ce service est par l'utilisateur lui-même en décochant la boîte.

vous pouvez implémenter votre service en C / C++, le construire dans un firmware personnalisé, et convaincre les gens d'installer ce micrologiciel sur leurs appareils.

lorsque nous installons gtalk et que nous nous connectons, il n'apparaît pas dans l'onglet Applications actives dans le Gestionnaire des tâches. Mais il s'exécute en arrière-plan.

C'est une partie du firmware.

6
répondu CommonsWare 2012-05-28 23:47:55

je pense que ce lien vous aidera.

bouton D'arrêt de force désactivé dans la gestion de l'application

son désactiver le bouton "Force Stop" dans la configuration de L'installateur Package, ainsi, personne ne peut arrêter votre application.

4
répondu PrashantAdesara 2017-05-23 11:47:15

vous ne pouvez pas empêcher votre service d'être tué en toutes circonstances. Toutefois, vous pouvez demander au système de redémarrer il. Il y a deux cas: (1) le processus meurt pour une raison anormale (2) le téléphone redémarre. Dans le premier cas, START_STICKY ou START_REDELIVER_INTENT sont utilisés pour redémarrer le service. Dans ce dernier, vous aurez besoin d'ajouter un Diffusreceiver pour android.intention.action.BOOT_COMPLETED.

votre code renvoie START_STICKY de onStartCommand, donc vous avez choisi l'un des chemins de redémarrage du service: "si le processus de ce service est tué pendant qu'il est démarré (après un retour de onStartCommand(Intent, int, int)), alors laissez-le dans l'état de démarrage mais ne retenez pas cette intention délivrée. Plus tard, le système tentera de recréer le service..."

"Ce mode de sens que pour les choses qui seront explicitement de démarrer et d'arrêter de courir pour arbitraire périodes de temps, comme un service en arrière-plan de lecture de la musique."

vous pouvez également utiliser START_REDELIVER_INTENT.

notez que si votre service fait un travail important, il doit s'exécuter dans un thread d'arrière-plan.

http://developer.android.com/reference/android/app/Service.html#START_STICKY

2
répondu Sofi Software LLC 2013-02-22 00:14:47

Je ne suis pas sûr que vous puissiez empêcher votre application d'être fermée par le Gestionnaire des tâches. Si vous pensez à ce sujet, cela fait sens pour elle d'être de cette façon. Imaginez que vous ayez une application qui ne répond pas aux commentaires des utilisateurs et qui ne répond pas non plus au fait d'être tué par le Gestionnaire des tâches. Pas bonne. Cependant j'ai trouvé cette question qui est dans une veine similaire à la vôtre. Vous pouvez également faire redémarrer automatiquement votre Service comme décrit ici (faire défiler vers le bas sur cette page un peu avant "démarrer un service "

1
répondu Kerry 2017-05-23 10:31:28

laissez votre Service fonctionner dans un processus séparé. Il y a un bon tutoriel dans ce blog .

vous pouvez spécifier l'attribut android:process dans la balise <Service> pour faire tourner votre application dans son propre processus.

<service
android:name="MyServiceName"
android:process="my_process" 
android:icon="@drawable/icon"
android:label="@string/service_name"
>
</service>
0
répondu Ronnie 2013-06-11 05:20:32

utilisez ma méthode si vous voulez démarrer une application cachée pour la première fois Je fais une activité de lanceur transparente comme celle-ci

<activity android:name=".MainActivity"
    android:label="@string/app_name"
    android:theme="@style/Theme.Transparent"
    android:excludeFromRecents="true"
    >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

donc je fais l'application cachée dans le lanceur en plaçant ce code dans oncreat() [Code]

PackageManager p = getPackageManager();
    ComponentName componentName = new ComponentName(this, MainActivity.class); // activity which is first time open in manifiest file which is declare as <category android:name="android.intent.category.LAUNCHER" />
p.setComponentEnabledSetting(componentName,PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);

donc j'utilise ce code pour afficher l'icône de l'application sur le lanceur et le faire tourner sur la classe de service qui utilise le démarrage du récepteur de diffusion et dans la classe de récepteur de diffusion de connexion réseau aussi(autostart.java et networkConnectinCheck.java):

PackageManager p = context.getPackageManager();
    ComponentName componentName = new ComponentName(context, MainActivity.class);
    p.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);

maintenant, je peux lancer app pour la première fois par les mains de l'utilisateur et après cela, j'utilise mon récepteur pour déjeuner app à tout moment.

0
répondu Masoud A. 2017-09-02 02:15:42

vous pouvez essayer de redémarrer le service sur onDestroy événement de service. Utilisez certains drapeaux pour trouver si le service est fermé par L'utilisateur ou sa force fermée.

notez Qu'il n'y a pas de garantie que onDestroy sera appelé à chaque fois.

-1
répondu Vipul Purohit 2012-05-30 08:54:27