强制停止后重启服务

Posted

技术标签:

【中文标题】强制停止后重启服务【英文标题】:Restart service after force stop 【发布时间】:2013-06-06 01:20:31 【问题描述】:

我正在开发一个用作应用程序储物柜的应用程序,该应用程序能够通过在打开这些应用程序时询问用户密码来保护其他已安装的应用程序,我的应用程序是 here

问题是应用程序很容易被从android任务管理器中强制关闭它跳过,我该如何克服这个问题?

还有什么是检查新应用程序打开的最佳方法,使服务每秒钟检查一次任务顶部的应用程序,或者每秒使用警报管理器发出警报以进行检查。

【问题讨论】:

[我有解决方案但不推荐,参考这个答案][1] [1]:***.com/questions/12672438/… @Omar 如果有任何解决方案,请发帖 【参考方案1】:

更新:

Restart service after force stop

答案:很抱歉,在用户手动启动应用程序之前,您无法重新启动它。

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

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

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

你也不能禁用强制停止按钮 AFAIK。您应该认为,除了您的应用程序和(在有限的范围内)您被授予访问权限的资源之外,设备上的任何内容都不是您可以控制的。

最后,如果您想强制停止,即使是 gtalk 应用程序也会屈从于您的意愿。它只会在您使用 Gtalk 或其他使用 gtalk 服务的应用程序(例如 PUSH Gmail)时启动(适用于 gtalk 不是固件一部分的手机)。

参考Link

解决办法:

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

【讨论】:

但是android会在选择强制停止时杀死我的服务,但是如果你点击停止,服务将再次起作用。 如果我使用 AlarmManager 每隔一秒安排一次 laram 并且用户停止了应用程序,aralm 也会停止? 问题出在一些中国手机中,即使滑动关闭它也会强制停止该应用程序。在你再次打开它之前它不会起作用。 嘿,Srihari,您可能在谈论 Vivo 和小米。我将对这些设备进行一些研究并保持更新这个答案。当我回答时,这些设备不存在。很抱歉。 gmail 小部件应用程序怎么样?当我强制停止它并返回主屏幕时,它会再次启动服务。【参考方案2】:

我通过调度 AlarmManager 解决了这个问题,再次运行我的服务:

    public void onDestroy() 
        AlarmManager alarmMgr = (AlarmManager)this.getSystemService(this.ALARM_SERVICE);
        Intent i = new Intent(this, MyService.class);
        PendingIntent pendingIntent = PendingIntent.getService(this, 0, i, 0);
        alarmMgr.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 10, pendingIntent);
    

【讨论】:

ASAIK,如果你有一个预定的闹钟并且用户强制停止你的应用程序,系统将取消你的闹钟。 这可以解决问题,但是我在执行上述 (AlarmManager) 代码后调用了 super.onDestroy()。 这个 onDestroy 会在哪里被调用?申请?【参考方案3】:

创建您自己的异常处理程序并在应用程序崩溃时启动服务..

你的异常处理类

*public class MyHandler implements UncaughtExceptionHandler 
    private Context m_context;


    public static void attach(Context context) 
        Thread.setDefaultUncaughtExceptionHandler(
            new MyHandler(context)
        );
    

    ///////////////////////////////////////////// implementation

    private MyHandler(Context context) 
        m_context=context;
    

    public void uncaughtException(Thread thread,Throwable exception) 
    /*  StringWriter stackTrace=new StringWriter();
        exception.printStackTrace(new PrintWriter(stackTrace));*/
        System.out.println("ERROR IS "+(exception));


        Intent intent=new Intent("com.sample.service.serviceClass");  
            m_context.startService(intent);

        // from RuntimeInit.crash()
        Process.killProcess(Process.myPid());
        System.exit(10);
    
*

附加到您的活动中

public class MyActivity extends Activity
public void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.grid_layout);
        MyHandler.attach(this);


【讨论】:

用户强制停止服务是否抛出异常? @msn 如果我附加此服务,这是否有效可以说,我附加此服务,如果有人停止服务,它将重新启动服务。我会将代码附加到 ondestroy() 但是我听说强制停止应用程序可能不会调用 onDestroy()

以上是关于强制停止后重启服务的主要内容,如果未能解决你的问题,请参考以下文章

如何ubuntu下启动/停止/重启MySQL

Nginx 启动 停止 重启

如何ubuntu下启动/停止/重启MySQL

如何ubuntu下启动/停止/重启MySQL

服务器重启,停止后再启动

监控windows服务,当服务停止后自动重启服务