我想在后台运行的服务。 当用户选中复选框,然后服务启动时,它是未经检查服务被停止什么我的应用程序确实是。 这是工作完全正常。 但问题是,当我从任务管理器关闭应用程序,然后它也停止服务。 我要的是保持业务正常运行即使它是从任务管理器关闭。 然后,只有这样,才能停止该服务是由用户自己通过unckecking箱。
我怎样才能做到这一点?
这里是我的代码
我的主要活动
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服务?
Answer 1:
我不知道这“任务管理器”你指的是不同的人会采取行动不同,所以当用户去设置我立足于行动我的回答 - >管理应用程序和 - >力停止的应用程序的方式Android已经给了他。
假设您的服务正在运行的进程的一部分,如果用户强制停止的过程中,你是从以后再运行该服务,直到用户手动启动you.This防止尤其是从3.0版本以上有效(检查你的)。 当你认为有一个应用程序,它保持一个服务启动所有的时间,很讨厌在某些方面,用户也顺理成章。 因此,当用户订购的应用程序命中(:)力站),它不应该重新启动该服务,继续窃听用户。
例如,试想一下,如果你可以创建应用程序刚刚在你的处理器时间由持有唤醒锁吃了会发生什么,你不能杀了他们。 这将是可怕的,一个巨大的安全灾难。
所以,直到用户启动的活动之一,你将无法通过任何方式重新启动服务。
你也不能AFAIK禁用强制停止按钮。 你应该采取的角度来看,没有什么设备上的是你,除了你的应用程序和(在有限的范围内)的资源,你授予访问权限的控制。
Finnally,如果你希望强制停止甚至每增加一个应用程序会屈从于你的意愿。 当您使用的使用,每增加一个服务,如Gmail的PUSH(用于手机,其中每增加一个心不是固件的一部分)的Gtalk或其他应用它才会开始。 也看看Android的C2DM这里:
https://stackoverflow.com/a/11238779/1218762
Answer 2:
但问题是,当我从任务管理器关闭应用程序,然后它也停止服务。
正确。
我要的是保持业务正常运行即使它是从任务管理器关闭。 然后,只有这样,才能停止该服务是由用户自己通过unckecking箱。
您可以在C / C ++实现您的服务,其打造成为一些自定义固件,并且说服人们在他们的设备上安装固件。
当我们安装的gtalk,一旦我们登录,然后它不会出现在任务管理器中活动的应用程序选项卡。 但是它在后台运行。
这是固件的一部分。
Answer 3:
我认为这个链接会帮助你。
禁用强制停止按钮在管理应用程序
它禁用程序包安装程序强制停止按钮设置的话,没有人能阻止你的应用程序。
Answer 4:
你不能阻止任何情况下都被杀害您服务。 但是,您可以要求系统重新启动。 有两种情况:(1)进程死掉了一些不正常的原因(2)手机重启。 在前者,START_STICKY或START_REDELIVER_INTENT用于重新启动该服务。 在后者中,你将需要添加一个BroadcastReceiver为android.intent.action.BOOT_COMPLETED。
你的代码是从onStartCommand返回START_STICKY,所以你所选择的服务重新启动路径之一:当它启动(从onStartCommand(意向,INT,INT)返回后)“如果此服务的过程中被杀死了,然后把它留在启动状态,但不保留此传递的意图。后来,系统将尝试重新创建服务......”
“这种模式是有道理的,将被明确地启动和停止,以进行背景音乐播放的任意时间周期,如服务运行的东西。”
您还可以使用START_REDELIVER_INTENT。
请注意,如果您的服务做任何显著的工作,它需要在后台线程中运行。
http://developer.android.com/reference/android/app/Service.html#START_STICKY
Answer 5:
我不完全相信你可以防止你的应用程序从通过任务管理器关闭。 如果你想想看,它是有道理的,它是这样的。 试想一下,你有没有对用户输入作出响应,也无法通过任务管理器被杀害响应的应用程序。 不好。 但是我发现这个问题,这是一个类似的静脉你的。 您也可以让系统自动重新启动描述您的服务在这里(向下滚动该网页上一点之前“启动服务”
Answer 6:
用我的方法,如果你想开始一个隐藏的应用只是我第一次做一个透明的发射活动是这样
<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()[编号]让隐藏在启动应用程序
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);
所以我用作秀的应用程序图标的代码上发射,并使其能够运行在使用广播接收器的启动和网络连接广播接收机类太(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);
现在,我可以第一次通过用户手中运行应用程序,并在此之后我用我的接收机吃午饭的应用程序的任何时间。
Answer 7:
让你的Service
在一个单独的进程中运行。 有一个很好的教程, 这个博客 。
您可以指定android:process
中属性<Service>
标记做出自己的过程中您的应用程序运行。
<service
android:name="MyServiceName"
android:process="my_process"
android:icon="@drawable/icon"
android:label="@string/service_name"
>
</service>
Answer 8:
你可以尝试在服务的onDestroy的事件重新启动服务。 使用一些标志找到,如果服务是由用户关闭或它的力量关闭。
请注意,有没有保证的onDestroy将每次调用。
文章来源: Restart the service even if app is force-stopped and Keep running service in background even after closing the app How?