我正在开发一个用作应用程序储物柜的应用程序,该应用程序能够通过在打开这些应用程序时询问用户密码来保护其他已安装的应用程序,我的应用程序在这里
问题是应用程序可以很容易地通过从android任务管理器中强制关闭来跳过,我该如何克服这个问题?
还有什么是检查新应用程序打开的最佳方法,使服务每秒钟检查一次任务顶部的应用程序,或者每秒使用警报管理器发出警报以进行检查。
我正在开发一个用作应用程序储物柜的应用程序,该应用程序能够通过在打开这些应用程序时询问用户密码来保护其他已安装的应用程序,我的应用程序在这里
问题是应用程序可以很容易地通过从android任务管理器中强制关闭来跳过,我该如何克服这个问题?
还有什么是检查新应用程序打开的最佳方法,使服务每秒钟检查一次任务顶部的应用程序,或者每秒使用警报管理器发出警报以进行检查。
更新 :
Restart service after force stop
答:抱歉,在用户手动启动应用程序之前,您无法重新启动它。
假设您的服务作为进程的一部分运行,并且如果用户强制停止您的进程,则在用户手动启动您之前,您将无法再次运行该服务。这对于 3.0 及更高版本特别有效(检查您的)。当您认为有一个应用程序始终保持服务启动并以某种方式让用户烦恼时,这似乎也是合乎逻辑的。因此,当用户在应用程序上点按 (:) force-stops) 时,它不应重新启动服务以继续对用户进行窃听。
例如,想象一下如果您可以创建应用程序,该应用程序通过持有唤醒锁在您的处理器时间吃掉,并且您无法杀死它们,会发生什么。这将是可怕的和巨大的安全灾难。
因此,在用户启动您的一项活动之前,您将无法以任何方式重新启动您的服务。
您也不能禁用强制停止按钮 AFAIK。您应该认为,除了您的应用程序和(在有限范围内)您被授予访问权限的资源之外,设备上的任何内容都不是您可以控制的。
最后,如果您想强制停止,即使是 gtalk 应用程序也会屈从于您的意愿。它只会在您使用 Gtalk 或其他使用 gtalk 服务的应用程序(例如 PUSH Gmail)时启动(适用于 gtalk 不是固件一部分的手机)。
参考链接
我通过调度 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);
}
创建您自己的异常处理程序 & 每当应用程序崩溃启动服务..
您的异常处理程序类
*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);
}
}