即使应用程序被强制停止,也要重新启动服务,即使在closures应用程序后,仍要继续在后台运行服务。

我正在尝试在后台运行服务。 我的应用程序做什么是当用户检查checkbox,然后服务启动,当它是未经检查的服务停止。 哪个工作得很好。 但问题是,当我从任务pipe理器closures应用程序,然后停止服务。 我想要的是即使在任务pipe理器closures之后仍然保持运行。 那么唯一的办法就是停止那个服务是由用户自己解开盒子。

我怎样才能做到这一点?

这是我的代码

我的主要活动

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

我的服务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 "即使应用程序被强制停止,也要重新启动服务,即使在closures应用程序后,仍要继续在后台运行服务。"

我不确定哪个“任务pipe理器”指的是不同的行为,因此我将回答放在操作上,当用户进入设置 – >pipe理应用程序, – >强制停止应用程序android给了他。

假设您的服务作为过程的一部分运行,并且如果用户强制停止您的过程,则会阻止您再次运行该服务,直到用户手动启动您为止。特别是在3.0及以上版本中有效(请检查您的服务)。 当你认为有一个应用程序始终保持服务开始并以某种方式令用户恼火时,这似乎也是合乎逻辑的。 因此,当用户在应用程序上命令(:)强制停止)时, 应该不会重新启动服务以继续窃听用户。

例如,想象一下,如果你可以通过持有唤醒锁来创build刚刚在你的处理器时间吃的应用程序,那么你会发生什么情况,而你不能杀死它们。 这将是可怕的和巨大的安全灾难。

因此,在用户启动其中一项活动之前,您无法以任何方式重新启动服务。

你也不能禁用强制停止buttonAFAIK。 除了应用程序和(在一定程度上)您授权访问的资源之外,您应该认为设备上没有任何东西可以控制。

最终,如果你希望强制停止的话,即使是gtalk应用也会屈服于你的意愿。 只有当您使用Gtalk或其他使用gtalk服务的应用程序(例如PUSH Gmail)时,才会启动它(对于gtalk不是固件一部分的手机)。 另外请看这里的Android C2DM

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

但问题是,当我从任务pipe理器closures应用程序,然后停止服务。

正确。

我想要的是即使在任务pipe理器closures之后仍然保持运行。 那么唯一的办法就是停止那个服务是由用户自己解开盒子。

您可以在C / C ++中实现您的服务,将其构build到一些自定义固件中,并说服人们在其设备上安装该固件。

当我们安装gtalk,一旦我们login,然后它不会出现在任务pipe理器中的活动应用程序选项卡。 但它在后台运行。

它是固件的一部分。

我认为这个链接将帮助你。
pipe理应用程序中禁用强制停止button

它禁用包安装程序设置中的强制停止button,所以没有人可以停止您的应用程序。

你不能阻止你的服务在任何情况下被杀死。 但是,您可以要求系统重新启动它。 有两种情况:(1)由于某些exception原因,进程死亡(2)电话重新启动。 在前者中,START_STICKY或START_REDELIVER_INTENT用于重新启动服务。 在后者中,您需要为android.intent.action.BOOT_COMPLETED添加一个BroadcastReceiver。

你的代码从onStartCommand返回START_STICKY,所以你select了一个服务重启path:“如果这个服务的进程在启动的时候被kill(从onStartCommand(Intent,int,int)返回后),那么把它留在开始状态,但不保留这个交付的意图,稍后系统将尝试重新创build服务…“

“这种模式对于明确启动和停止运行任意时间段的内容是有意义的,比如执行背景音乐播放的服务。”

您也可以使用START_REDELIVER_INTENT。

请注意,如果您的服务正在做任何重要的工作,则需要在后台线程中运行。

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

我不完全相信你可以阻止你的应用程序被TaskManagerclosures。 如果你仔细想一想,那是有道理的。 想象一下,你有一个应用程序无法响应用户input,也无法响应被任务pipe理器杀死。 不好。 但是,我发现这个问题与你的问题类似。 您也可以让系统自动按照此处所述重新启动服务(在“启动服务”之前向下滚动该页面,

让您的Service在一个单独的过程中运行。 这个博客有一个很好的教程。

您可以在<Service>标记中指定android:process属性,使您的应用程序在其自己的进程中运行。

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

如果你想第一次启动一个隐藏的应用程序,使用我的方法,我做了这样一个透明的启动器活动

 <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> 

所以我通过将这个代码放在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); 

因此,我使用此代码在启动器上显示应用程序图标,并使其能够在使用广播接收器启动的服务类以及networking连接广播接收器类(autostart.java和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); 

现在,我可以通过用户手中的第一次运行应用程序,然后在任何时候使用我的接收器的午餐应用程序。

您可以尝试重新启动onDestroy服务事件的服务。 使用一些标志来查找用户是否closures了服务或closures了其服务。

请注意,并不保证每次都会调用onDestroy。