强制停止后重启服务

时间:2013-06-10 11:36:58

标签: android android-service forceclose

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

问题是可以通过强制从android任务管理器关闭它来轻松跳过应用程序,我该如何克服这个问题?

另外,检查新应用程序打开的最佳方法是什么,制作一项服务,每隔一秒检查一次应用程序的任务,或者每秒发出一次警报管理器以进行检查。

3 个答案:

答案 0 :(得分:4)

已更新:

Restart service after force stop

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

假设您的服务是作为流程的一部分运行的,并且如果用户强行停止您的流程,则会阻止永远再次运行该服务,直到用户手动启动你。这特别适用于 3.0及以上版本(检查你的)。当您认为有一个应用程序始终保持服务启动并且以某种方式使用户烦恼时,这似乎也是合乎逻辑的。因此,当用户在应用程序上命令命中(:)强制停止时,不应重新启动服务以继续窃听用户。

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

因此,不会以任何方式重启您的服务,直到用户启动您的某项活动为止。

此外,您无法禁用强制停止按钮AFAIK。您应该认为除了您的应用程序之外,设备上没有任何内容可以控制,并且(在有限的范围内)您被授予访问权限的资源。

最后,如果你想强迫停止,即使是gtalk app也会屈服于你的意志。只有当您使用Gtalk或其他使用gtalk服务的应用程序(例如PUSH Gmail)(对于gtalk不属于固件的手机)时,它才会启动。

参考Link

解决方案:

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

答案 1 :(得分:1)

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

create procedure dbo.FooSelect
    @key uniqueidentifier
as
begin
    set nocount on

    declare @count bigint

    declare @temp table (   FooID       bigint,
                            Name        nvarchar(100)
                            primary key (FooID))

    if not exists ( select 1
                    from dbo.Foo f
                    where f.Key = @key)
    begin
        ;throw 50000, 'Invalid key, permission denied!', 1
    end

    --#####################################################################
    -- declare better here (below the possible error) so in case of an error no memory is allocated?
    --#####################################################################

    select @count = count(*)
    from dbo.Foo

    if @count > 10
    begin
        insert into @temp (FooID, Name)
        select 
        from dbo.Foo f
        where f.Key = @key
              and f.FooID > 100
    end
    else
    begin
        insert into @temp (FooID, Name)
        select 
        from dbo.Foo f
        where f.Key = @key
              and f.FooID < 100
    end

    select *
    from @temp

    return 1
end

答案 2 :(得分:0)

创建自己的异常处理程序&amp;每当app崩溃开始服务..

您的异常处理程序类

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