繁体   English   中英

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

[英]Restart the service even if app is force-stopped and Keep running service in background even after closing the app 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服务一样运行?

我不确定您指的是哪个“任务管理器”会以不同的方式执行操作,所以我将答案基于用户进入“设置”->“管理应用程序”并->强制停止应用程序时的操作android给了他。

假设您的服务正在运行的进程的一部分,如果用户强制停止的过程中,你是从以后再运行该服务,直到用户手动启动you.This防止尤其是从3.0版本以上有效(检查你的)。 当您认为有一个应用程序始终保持服务启动并以某种方式使用户烦恼时,这似乎也合乎逻辑。 因此,当用户在应用上命令命中(:)强制停止)时,它不应重新启动服务以继续困扰用户。

例如,想象一下,如果您创建一个仅通过持有唤醒锁就可以在处理器时间使用的应用程序,而又无法杀死它们,将会发生什么情况。 这将是可怕的,并且将是巨大的安全灾难。

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

同样,您不能禁用强制停止按钮AFAIK。 您应该认为,除了您的应用程序和(在一定程度上)授予您访问权限的资源之外,设备上什么都没有您可以控制。

最后,如果您想强制停止,即使gtalk应用程序也会屈服于您的意愿。 仅当您使用Gtalk或使用gtalk服务的其他应用程序(例如PUSH Gmail)(对于gtalk不属于固件的手机)时,它才会启动。 还可以在这里查看Android C2DM

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

但是问题是,当我从任务管理器中关闭应用程序时,它也停止了服务。

正确。

我想要的是即使从任务管理器关闭后也要保持服务运行。 然后,停止该服务的唯一方法是由用户自己打开框。

您可以使用C / C ++实现服务,将其构建到某些自定义固件中,然后说服人们在其设备上安装该固件。

安装gtalk并登录后,它不会出现在任务管理器的“活动应用程序”选项卡中。 但是它在后台运行。

它是固件的一部分。

我认为此链接将为您提供帮助。
在管理应用程序中禁用强制停止按钮

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

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

您的代码正在从onStartCommand返回START_STICKY,因此您选择了服务重新启动路径之一:“如果此服务的进程在启动时被杀死(从onStartCommand(Intent,int,int)返回之后),则将其保留在处于开始状态,但不保留此交付意图。稍后,系统将尝试重新创建服务...”

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

您也可以使用START_REDELIVER_INTENT。

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

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

我不确定您是否可以阻止TaskManager关闭您的应用。 如果您考虑一下,那么这样做是有意义的。 想象一下,您有一个应用程序既无法响应用户输入,又无法响应被任务管理器杀死。 不好。 但是我发现这个问题与您的问题相似。 另外,您还可以让系统按照此处所述自动重新启动服务(在“启动服务”之前向下滚动至该页面略微

如果您想首次启动隐藏的应用程序,请使用我的方法,例如,我进行透明的启动器活动

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

因此,我将此代码用于启动器上的show 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);

现在,我可以用用户的手第一次运行该应用程序,此后,我可以随时使用接收方的午餐应用程序。

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM