即使应用被强制停止,也重新启动服务,即使在关闭应用后仍继续在后台运行服务 如何?

2022-09-02 20:50:11

我正在尝试在后台运行服务。我的应用执行的操作是,当用户选中复选框时,服务启动,如果未选中,服务将停止。这很好用。但问题是,当我从任务管理器关闭应用程序时,它也停止了服务。我想要的是保持服务运行,即使它与任务管理器很近。然后,停止该服务的唯一方法是用户自己通过取消对框的卡顿。

我怎样才能做到这一点?

这是我的代码

我的主要活动

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服务一样运行?


答案 1

我不确定你所指的哪个“任务管理器”会有不同的行为,所以我的答案是基于用户进入设置时的操作 - >管理应用程序 - >强制阻止应用程序,就像Android给他的那样。

假设您的服务作为进程的一部分运行,并且如果用户强制停止您的进程,则在用户手动启动您之前,您将无法再次运行该服务。这在3.0及更高版本(检查您的版本)中尤其有效。当您认为有一个应用程序可以始终保持服务启动并以某种方式惹恼用户时,这似乎也是合乎逻辑的。因此,当用户订购命中( :)force-stops)在应用上,它不应该重新启动服务以继续窃听用户。

例如,想象一下,如果您可以通过按住唤醒锁来创建仅在处理器时间吃东西的应用程序,并且您无法杀死它们,会发生什么。这将是可怕的,是一场巨大的安全灾难。

因此,在用户启动您的某个活动之前,您将无法以任何方式重新启动服务。

此外,您无法禁用强制停止按钮AFAIK。您应该认为,除了您的应用程序以及(在有限的程度上)您被授予访问权限的资源之外,设备上的任何内容都不属于您。

芬恩地说,如果你想强制停止,即使是gtalk应用程序也会屈服于你的意志。只有当您使用Gtalk或其他使用gtalk服务的应用程序时,它才会启动,例如PUSH Gmail(适用于gtalk不是固件一部分的手机)。也看看 Android C2DM 这里:

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


答案 2

我认为这个链接会帮助你。
禁用管理应用程序中的强制停止按钮

它禁用了包安装程序设置中的“强制停止”按钮,因此没有人可以停止您的应用程序。


推荐