有一类Android应用程序可以在某些用户指定的应用程序上启用密码保护;例如,Android Protector。我需要从不同的方向解决这个问题。
是否可以创建阻止所有活动启动的应用程序,除非它们位于预定义的白名单中?这种方法会产生意想不到的后果吗?我熟悉Android基础知识并编写了一些相当简单的应用程序,但我仍在试图弄清楚这些“Protector”应用程序如何正确拦截启动意图。有人会介意给我一个关于正确方法的简要概述吗?
基本问题是我们有一个通用的Android手机,需要锁定,以便我们的客户(仅限内部)可以访问我们的自定义应用程序,而无法播放“极品飞车”等。我想删除运营商英国媒体报道,但生根设备似乎是一个维护头痛。我们希望每部手机的设置都像安装一些自定义应用程序一样简单。
答案 0 :(得分:7)
编辑详细说明解决方案
<强>概述强>
我的简单解决方案是向我的应用程序添加新服务和活动。该服务使用Handler
和postDelayed
来连续安排监控任务。监视任务检查当前活动是否在白名单中。获取当前正在运行的活动涉及ActivityManager
以及对getRunningTasks
的调用。完成检查后,监控任务会自行安排在X秒后再次运行(在我的情况下为1)。
如果顶部的活动不在白名单上,我们会启动阻止活动,该活动会弹出当前正在运行的任何内容。阻止活动的关键部分是它覆盖onBackPressed
,阻止用户简单地返回“坏”活动。按住Home键是(据我所知)离开此屏幕的唯一方法。
<强>提示强>
我不喜欢我的服务在后台不断循环;这似乎很浪费。我想找到一些方法在启动新任务时得到通知,但我找不到办法做到这一点。我的特定监听时间值和我的特定电话的电池使用情况是可以接受的;虽然你自己在采用它之前一定要测试。
答案 1 :(得分:4)
一个有效的解决方案,这是来自作者意见的代码
public class MonitorService extends Service {
private Handler handler;
Runnable runnable;
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
handler = new Handler();
runnable = new Runnable() {
@Override
public void run() {
new Thread(new Runnable() {
@Override
public void run() {
ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningTaskInfo> taskInfo = am
.getRunningTasks(1);
ComponentName componentInfo = taskInfo.get(0).topActivity;
String currentActivityName=componentInfo.getClassName();
String packageName=componentInfo.getPackageName();
if(whitelist.contains(currentActivityName)){
Intent launchIntent = new Intent();
launchIntent.setComponent(new ComponentName(blockActivityPackageName,
blockActivityName));
launchIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(launchIntent);
}
}
}).start();
handler.postDelayed(this, 1000);
}
};
handler.postDelayed(runnable, 1000);
}
@Override
public void onStart(Intent intent, int startId) {
super.onStart(intent, startId);
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onDestroy() {
super.onDestroy();
Intent intent = new Intent(this, MonitorService.class);
startService(intent);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return START_STICKY;
}
答案 2 :(得分:0)
如你所知,编写自定义启动器可能会更干净;查看此开源启动器以获取参考http://code.google.com/p/adw-launcher-android/