Перезапустите службу, даже если приложение отключено и продолжает работать в фоновом режиме даже после закрытия приложения How?

Я пытаюсь запустить службу в фоновом режиме. То, что делает мое приложение, – это когда пользователь проверяет флажок, а затем запускается сервис, и когда он отключен, служба остановлена. Что работает отлично. Но проблема в том, что когда я закрыл приложение из диспетчера задач, он также останавливает службу. Я хочу, чтобы служба работала даже после того, как она находится рядом с диспетчером задач. Тогда единственный способ остановить эту услугу – сам пользователь, сняв коробку.

Как я могу это достичь?

Вот мой код

Моя основная деятельность

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)); } } }); } } 

Мой класс обслуживания

 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(); } } 

Обновить

Как мы можем сделать эту услугу так, чтобы она работала как сервис gtalk?

Solutions Collecting From Web of "Перезапустите службу, даже если приложение отключено и продолжает работать в фоновом режиме даже после закрытия приложения How?"

Я не уверен, какой «Диспетчер задач» вы называете разными, будут действовать по-другому, поэтому я основываю свой ответ на действии, когда пользователь переходит в «Настройки» -> «Управление приложениями» и -> «Сила» останавливает приложение так Андроид дал ему.

Предполагая, что ваша служба запущена как часть процесса, и если пользователь принудительно останавливает ваш процесс, вам не разрешается выполнять службу снова, пока пользователь не запускает вас вручную. Это особенно актуально с версии 3.0 и выше (проверьте для своего ). Это также кажется логичным, если вы считаете, что есть приложение, которое постоянно запускает сервис и каким-то образом раздражает пользователя. Поэтому, когда пользователь заказывает хит (:) force-stops) в приложении, он не должен перезапускать службу, чтобы продолжить прослушивание пользователя.

Например, представьте, что произойдет, если вы сможете создавать приложения, которые просто ели в ваше процессорное время, удерживая блокировку слежения, и вы не могли их убить. Это было бы ужасно и огромная катастрофа в сфере безопасности.

Таким образом, вы не сможете перезапустить службу любыми способами, пока пользователь не запустит одно из ваших действий.

Также вы не можете отключить кнопку AFAIK. Вы должны принять точку зрения, что ничто на устройстве не является вашим, кроме вашего приложения, и (в ограниченной степени) ресурсами, которым вы получаете доступ.

В финнале даже приложение gtalk согнется по вашему желанию, если вы захотите принудительно остановить. Он начнется только при использовании Gtalk или других приложений, которые используют сервис gtalk, такой как PUSH Gmail (для телефонов, где gtalk не является частью прошивки). Также взгляните на Android C2DM здесь:

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

Но проблема в том, что когда я закрыл приложение из диспетчера задач, он также останавливает службу.

Верный.

Я хочу, чтобы служба работала даже после того, как она находится рядом с диспетчером задач. Тогда единственный способ остановить эту услугу – сам пользователь, сняв коробку.

Вы можете реализовать свою службу на C / C ++, встроить ее в какую-то специальную прошивку и убедить людей установить эту прошивку на своих устройствах.

Когда мы устанавливаем gtalk и как только мы входим в систему, он не отображается на вкладке активных приложений в диспетчере задач. Но он работает в фоновом режиме.

Это часть прошивки.

Я думаю, эта ссылка вам поможет.
Отключить кнопку принудительной остановки в управлении приложением

Его отключить кнопку «Стоп» в настройке установщика пакетов, чтобы никто не мог остановить ваше приложение.

Вы не можете предотвратить убийство вашего служения при любых обстоятельствах. Однако вы можете попросить систему перезагрузить его. Есть два случая: (1) процесс умирает по какой-то ненормальной причине (2) перезагрузка телефона. В первом случае START_STICKY или START_REDELIVER_INTENT используются для перезапуска службы. В последнем случае вам необходимо добавить BroadcastReceiver для android.intent.action.BOOT_COMPLETED.

Ваш код возвращает START_STICKY из onStartCommand, поэтому вы выбрали один из путей перезапуска службы: «если процесс этой службы убит во время ее запуска (после возвращения из onStartCommand (Intent, int, int)), оставьте его в Началось состояние, но не сохранило это поставленное намерение. Позже система попытается воссоздать сервис … »

«Этот режим имеет смысл для вещей, которые будут явно запущены и остановлены для запуска в течение произвольных периодов времени, таких как служба, выполняющая воспроизведение фоновой музыки».

Вы также можете использовать START_REDELIVER_INTENT.

Обратите внимание, что если ваша служба выполняет значительную работу, ее необходимо запустить в фоновом потоке.

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

Я не совсем уверен, что вы можете запретить закрывать приложение TaskManager. Если вы думаете об этом, это имеет смысл для этого. Представьте, что у вас есть приложение, которое не отвечает на ввод пользователя, а также не отвечает на то, что его убил диспетчер задач. Нехорошо. Однако я нашел этот вопрос, который похож на ваш. Также вы можете заставить систему автоматически перезапустить службу, как описано здесь (немного прокрутите страницу вниз до «начала обслуживания»)

Пусть ваша Service запускается в отдельном процессе. В этом блоге есть хороший учебник.

Вы можете указать атрибут android:process в <Service> чтобы приложение выполнялось в рамках собственного процесса.

 <service android:name="MyServiceName" android:process="my_process" android:icon="@drawable/icon" android:label="@string/service_name" > </service> 

Вы можете попробовать перезапустить службу на событии onDestroy. Используйте несколько флагов, чтобы найти, закрыт ли Пользователь пользователем или его сила закрыта.

Обратите внимание, что нет гарантии, что onDestroy будет вызываться каждый раз.