Java 在服务中满足条件时立即启动/取消活动

Java 在服务中满足条件时立即启动/取消活动,java,android,security,service,Java,Android,Security,Service,因此,我正在为android构建一个应用程序锁定器。我为我的锁定器活动编写了一个服务,在android应用程序堆栈顶部检测到特定活动时立即启动。要锁定的应用程序列表存储在数据库的一个表中。在大多数情况下,我的服务工作正常。但我面临一些我不知道的问题知道如何克服困难。任何帮助都是可以接受的 我想解决以下问题 1) 当我按下后退按钮时,我希望我的锁柜活动和要锁定的应用程序停止执行。在我的例子中,当我按下后退按钮时,锁活动会一次又一次地启动 2) 当需要锁定的特定应用程序启动时,在调用我的locker

因此,我正在为android构建一个应用程序锁定器。我为我的锁定器活动编写了一个服务,在android应用程序堆栈顶部检测到特定活动时立即启动。要锁定的应用程序列表存储在数据库的一个表中。在大多数情况下,我的服务工作正常。但我面临一些我不知道的问题知道如何克服困难。任何帮助都是可以接受的

我想解决以下问题

1) 当我按下后退按钮时,我希望我的锁柜活动和要锁定的应用程序停止执行。在我的例子中,当我按下后退按钮时,锁活动会一次又一次地启动

2) 当需要锁定的特定应用程序启动时,在调用我的locker活动之前,该应用程序会在屏幕上显示1秒或2秒。我希望直接调用我的locker活动

3) 有时,一旦用户已经验证了自己的身份(这是不想要的),就会再次调用我的locker活动。(我认为这是服务检查前台活动的时间安排的原因)

我的服务

public class LockerService extends Service {
private static final String TAG = "MyService";
String LockedApps[];
String allowedapp = null;
DataBaseHandler handler;

private final static Handler servicehandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {

    }
};

@Override
public void onCreate() {
    // TODO Auto-generated method stub
    super.onCreate();
    handler = new DataBaseHandler(this);

}

@Override
public IBinder onBind(Intent intent) {
    // TODO Auto-generated method stub
    return null;
}

private Runnable checkforeground = new Runnable() {
    public void run() {
        // / Any thing you want to do put the code here like web service
        // procees it will run in ever 1 second
        handler.open();
        LockedApps = handler.getPackages();
        handler.close();

        ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningAppProcessInfo> runningAppProcessInfo = am
                .getRunningAppProcesses();
        String foregroundapp = runningAppProcessInfo.get(0).processName
                .toString();
        SharedPreferences sp = PreferenceManager
                .getDefaultSharedPreferences(LockerService.this);
        allowedapp = sp.getString("allowedapp", "anon");

        if ((Arrays.asList(LockedApps).contains(foregroundapp))
                && (allowedapp.equals(foregroundapp))) {
            // do nothing
        } else if (Arrays.asList(LockedApps).contains(foregroundapp)) {
            // show your activity here on top of
            // PACKAGE_NAME.ACTIVITY_NAME
            Intent lockIntent = new Intent(getBaseContext(), Locker.class);
            lockIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

            getBaseContext().startActivity(lockIntent);
        }
        servicehandler.postDelayed(this, 1500); // 1.5 seconds
    }
};

@Override
public void onStart(Intent intent, int startId) {

    servicehandler.removeCallbacks(checkforeground);
    servicehandler.postDelayed(checkforeground, 1500);// 1.5 second
    Log.d(TAG, "onStart");
}

}
公共类锁服务扩展服务{
私有静态最终字符串TAG=“MyService”;
字符串锁定apps[];
字符串allowedapp=null;
数据库处理程序;
私有最终静态处理程序servicehandler=新处理程序(){
@凌驾
公共无效handleMessage(消息消息消息){
}
};
@凌驾
public void onCreate(){
//TODO自动生成的方法存根
super.onCreate();
handler=新的DataBaseHandler(此);
}
@凌驾
公共IBinder onBind(意向){
//TODO自动生成的方法存根
返回null;
}
private Runnable checkforeground=new Runnable(){
公开募捐{
///您想做的任何事情都可以像web服务一样将代码放在这里
//它将在1秒内运行
handler.open();
LockedApps=handler.getPackages();
handler.close();
ActivityManager am=(ActivityManager)getSystemService(Context.ACTIVITY_服务);
列表runningAppProcessInfo=am
.getRunningAppProcesses();
String foregroundapp=runningAppProcessInfo.get(0).processName
.toString();
SharedReferences sp=首选项管理器
.getDefaultSharedReferences(LockerService.this);
allowedapp=sp.getString(“allowedapp”、“anon”);
if((Arrays.asList(LockedApps.contains)(foregroundapp))
&&(allowedapp.equals(foregroundapp))){
//无所事事
}else if(Arrays.asList(LockedApps.contains)(foregroundapp)){
//在屏幕上方显示您的活动
//包名称。活动名称
Intent lockIntent=newintent(getBaseContext(),Locker.class);
lockIntent.addFlags(Intent.FLAG\u活动\u新任务);
getBaseContext().startActivity(lockIntent);
}
servicehandler.postDelayed(这是1500);//1.5秒
}
};
@凌驾
公共无效启动(Intent Intent,int startId){
servicehandler.removeCallbacks(检查前台);
servicehandler.postDelayed(检查前景,1500);//1.5秒
Log.d(标签“onStart”);
}
}

只需覆盖locker活动中的onBackPressed()方法,并向主启动器发出一个意向。这没什么,但它将带您进入主屏幕