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

Java 即使应用程序被强制停止也要重新启动服务,即使关闭应用程序也要在后台继续运行服务。如何?,java,android,android-service,Java,Android,Android Service,我正在尝试在后台运行服务。我的应用程序所做的是,当用户选中复选框时,服务启动,当未选中时,服务停止。这是非常好的工作。但问题是,当我从task manager关闭应用程序时,它也会停止服务。我想要的是保持服务运行,即使它与任务管理器关闭。然后,停止该服务的唯一方法是用户自己打开盒子 我怎样才能做到这一点 这是我的密码 我的主要活动 public class SampleServiceActivity extends Activity { /** Called when the activity

我正在尝试在后台运行服务。我的应用程序所做的是,当用户选中复选框时,服务启动,当未选中时,服务停止。这是非常好的工作。但问题是,当我从task manager关闭应用程序时,它也会停止服务。我想要的是保持服务运行,即使它与任务管理器关闭。然后,停止该服务的唯一方法是用户自己打开盒子

我怎样才能做到这一点

这是我的密码

我的主要活动

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

我不完全确定您是否可以阻止TaskManager关闭您的应用程序。如果你仔细想想,这样做是有道理的。假设您有一个应用程序无法响应用户输入,也无法响应被任务管理器杀死。不好的。然而,我发现了一个和你们类似的问题。此外,您还可以让系统按照所述自动重新启动您的服务

我不确定您指的是哪个“任务管理器”,因为不同的“任务管理器”会有不同的行为,因此我的回答基于用户进入设置-->管理应用程序-->强制停止应用程序时的操作,就像android给他的那样。 假设您的服务作为流程的一部分运行,并且如果用户强制停止您的流程,则在用户手动启动您之前,您将无法再次运行服务。这在3.0及以上版本中尤其有效(请检查您的版本)。当你认为有一个应用程序可以让服务一直启动,并且在某种程度上让用户感到恼火时,这似乎也是合乎逻辑的。因此,当用户在应用程序上命令点击(:)强制停止)时,不应该重新启动服务来继续窃听用户。例如,想象一下,如果你可以通过持有唤醒锁创建只在处理器时间吃东西的应用程序,而你无法杀死它们,会发生什么。这将是一场可怕的安全灾难。 因此,在用户启动您的一项活动之前,您将无法通过任何方式重新启动服务。

此外,您不能禁用强制停止按钮AFAIK。你应该采取这样的观点:除了你的应用程序和(在有限的范围内)你被授予访问权限的资源之外,设备上没有任何东西是你可以控制的。 最后,如果你想强制停止,即使是gtalk应用程序也会屈服于你的意志。只有当您使用Gtalk或其他使用Gtalk服务的应用程序,如推送Gmail(适用于Gtalk不是固件一部分的手机)时,它才会启动。还可以在这里查看Android C2DM


让您的
服务在单独的流程中运行。有一个很好的教程

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

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

您可以尝试在onDestroy服务事件时重新启动服务。使用一些标志来查找服务是由用户关闭还是强制关闭


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

您无法防止您的服务在任何情况下都被终止。但是,您可以要求系统重新启动它。有两种情况:(1)进程因某些异常原因死亡(2)手机重新启动。在前者中,START_STICKY或START_REDELIVER_INTENT用于重新启动服务。在后者中,您需要为android.intent.action.BOOT_添加一个BroadcastReceiver

您的代码从onStartCommand返回START\u STICKY,因此您选择了服务重启路径之一:“如果此服务的进程在启动时被终止(从onStartCommand返回后(Intent、int、int)),然后将其保持在已启动状态,但不保留此传递的意图。稍后系统将尝试重新创建服务…”

此模式适用于将显式启动和停止以运行任意时间段的内容,例如执行背景音乐播放的服务

您还可以使用START\u REDELIVER\u INTENT

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


我想这个链接会对你有所帮助。


它在Package Installer设置中禁用强制停止按钮,这样就没有人可以停止您的应用程序。

如果您想第一次启动隐藏的应用程序,请使用我的方法 我创建了一个透明的启动程序,如下所示

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

现在,我可以第一次通过用户手动运行应用程序,之后我可以随时使用我的接收器的to午餐应用程序。

我的问题是,可以从任务管理器关闭应用程序,但其服务不应该关闭。从该应用程序启动的服务只能由用户手动关闭。或者,第二种方法是,该应用程序不应在任务管理器的“活动应用程序”选项卡中可见。因此,它不能从那里关闭。就像Gtalk一样。当我们安装gtalk并登录后,它不会出现在任务管理器的活动应用程序选项卡中。但它是在后台运行的,就像桌面上的任务管理器。它还允许您杀死系统应用程序。所以,我看不出你为什么要避免被杀。我的意思是,Gmail服务也允许自己被杀。我想你必须接受这一点。不能保证每次都会调用
ondestory
。看到这一点了,但是“强制停止”不会杀死与应用程序相关的所有进程吗?你说得很好,但我不明白这怎么不可能。在4.0(ICS)中,即使我强制关闭谷歌的日历应用程序,它仍然会激活通知。我也想知道如何做到这一点。“有什么想法吗?”安迪问
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);
PackageManager p = context.getPackageManager();
    ComponentName componentName = new ComponentName(context, MainActivity.class);
    p.setComponentEnabledSetting(componentName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);