Android 屏蔽指定activity启动(程序锁)

该博客介绍了如何在Android中实现一个服务(Service),通过不断检测Activity栈顶来判断是否启动了指定的Activity。当检测到受保护的程序(如com.android.mms)启动时,服务将引导到自定义的认证授权Activity。作者提到SDK中没有直接的回调或广播API来实现此功能,因此采用了循环检测的方法,但希望找到更优的解决方案。示例代码展示了一个使用AsyncTask持续检测的Service实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

         某些安全管理类具有程序锁功能,大致功能是这样的:安全管理程序列出系统中的所有应用,用户选定一些想锁定的程序,并设置好密码,这样以后,再运行那些程序会跳转到一个权限页面,要求输入密码访问,或者不访问并推出。如何实现呢?

  第一个想法就是写一个service监测activity 栈,如果栈顶有更改,则判断其是否为受保护的程序,是,就intent转向自己定义的认证授权activity;否,则什么都不做。

找来找去,sdk没有提供某个回调方法或事件、广播之类的api,只能自己一直while中检测。

  于是寻找第二种方法,在源码中找所有service和aidl,也没发现callback或者broadcast,activitymanager除了更改源码,无法在外部让它具有此类功能。

  native层?暂不考虑。

现在把示例代码写出来,谁知道不用while的方式去检测activity栈顶情况的方法,请告诉我,谢了。

service 中的代码:


import java.util.List;

import android.app.ActivityManager;
import android.app.ActivityManager.RunningTaskInfo;
import android.app.Service;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.AsyncTask;
import android.os.IBinder;
import android.util.Log;


public class ActvityObserverService extends Service {
 
    
    @Override
    public IBinder onBind(Intent intent) {
                      
                return null;
    }
    
//循环终止标志
boolean flag=true;
//要保护的程序,也就是个包名了
String pakageName="com.android.mms";
    
@Override
public void onStart(Intent intent, int startId) {
    super.onStart(intent, startId);
    
    //我们将通过activity管理服务获得当前activity栈的内容
    final ActivityManager am=(ActivityManager)getSystemService(ACTIVITY_SERVICE);
    
    //这个intent可以写死,因为一直都是转向这个
    final Intent mintent=new Intent();
    //flag必须是new task,仔细想想service与activity的区别就明白了。
    mintent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        //这个不用说了
    mintent.setClass(getApplicationContext(),LockActivity.class);
    
    //一个线程,让我一直检测
    AsyncTask taskWatcher=new AsyncTask() {
        @Override
        protected Object doInBackground(Object... params) {
            
            //把这个while当成看门狗吧。
            while(true){
                
                /**我们只需要获得1个RunningTasks,一般情况下,会从栈顶按照传入的个数来获取
                一个集合,总有一个activity的,不会报空的请放心
                */
                String name=am.getRunningTasks(1).get(0).topActivity.getPackageName();
                
                /**判断当前activity的包是否是属于受保护的
                当然,实际情况下是读取数据什么的,获取一个集合
                这个集合通常是提前列出系统所有安装的apk包,并让用户选择所得到的
                */
                if(pakageName.equals(name)){
                    startActivity(mintent);
                }
                            try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            
            }
        }
    };
        taskWatcher.execute(null);

}
    }



仅当抛砖引玉,如有不对,望请指正。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值