Android监听进入和退出第三方应用

         本篇文章基本实现,监听进入和退出第三方应用的功能。经验不足,有问题之处,欢迎留言指出,先三克油了。参考文章http://blog.csdn.net/xiao_chilun/article/details/52096149。大致的思路如下:
         创建一个service,每隔一定时间获取当前运行应用的packageName,并把该值赋给一临时变量temp。当未有应用运行时,获取的是手机桌面应用Lanucher。现在packageName和temp的组合值有5中情况:

未进入应用

第一种情况:packageName=系统应用包名               
                    temp=系统应用包名

进入应用

第二种情况:packageName=第三方应用包名

                    temp=系统应用包名

第三种情况:packageName=第三方应用包名

                    temp=第三方应用包名

退出应用

第四种情况:packageName=系统应用包名

                    temp=第三方应用包名

第五种情况:packageName=系统应用包名

                    temp= 系统应用包名

分析后,第二种情况是进入应用,第四种情况是退出应用。

先挂两个知识点:

1、判断是否为第三方应用

 //判断是否为第三方应用
    public boolean isThirdPartApp(String packageName) {
        boolean b = false;
        PackageInfo  mPackageInfo = null;
        try {
            mPackageInfo = getApplication().getPackageManager().getPackageInfo(packageName, 0);
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        //判断是否为系统预装的应用
            if ((mPackageInfo.applicationInfo.flags & mPackageInfo.applicationInfo.FLAG_SYSTEM) <= 0 ) {
                //第三方应用
                b = true;
            } else
            {
                //系统应用
            }
        return  b;
    }
2、获取当前运行的应用包名
ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
List runningTasks = am.getRunningTasks(1);
ActivityManager.RunningTaskInfo runningTaskInfo = runningTasks.get(0);
ComponentName topActivity = runningTaskInfo.topActivity;
String packageName = topActivity.getPackageName();

具体实现方法:

public class ListenerService extends Service {
    private String temp = null;
    private List mList = new ArrayList<>();
    private static final String TAG = "ListenerService";
    private static boolean flag = true;//服务Destroy结束线程
    private ActivityManager am;

    @Override
    public void onCreate() {
        super.onCreate();
        //监视任务栈最顶端应用
        am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        new Thread() {
            @Override
            public void run() {
                super.run();
                while (flag) {
                    synchronized (ListenerService.class) {
                        List runningTasks = am.getRunningTasks(1);
                        ActivityManager.RunningTaskInfo runningTaskInfo = runningTasks.get(0);
                        ComponentName topActivity = runningTaskInfo.topActivity;
                        String packageName = topActivity.getPackageName();
                        if (!getPackageName().equals(packageName)  && !getPackageName().equals(temp) && temp != null) {
                            //进入第三方应用,第二种情况
                            if (isThirdPartApp(packageName) && !isThirdPartApp(temp)) {
                                if (mList.contains(packageName)) {
                                        Log.i(TAG, packageName + ":返回第三方应用");
                                } else if (!mList.contains(packageName)) {
                                    mList.add(packageName);
                                    Log.i(TAG, packageName + ":首次进入第三方应用");
                                }
                             //退出第三方应用,第四种情况
                            } else if (!isThirdPartApp(packageName) && isThirdPartApp(temp)) {
                                Log.i(TAG, packageName + ":退出第三方应用");
                            }
                        }
                        temp = packageName;
                        SystemClock.sleep(500);
                    }
                }
            }
        }.start();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        flag = false;
        mList.clear();
        mList = null;
    }
    
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

     //判断是否为第三方应用
    public boolean isThirdPartApp(String packageName) {
        boolean b = false;
        PackageInfo  mPackageInfo = null;
        try {
            mPackageInfo = getApplication().getPackageManager().getPackageInfo(packageName, 0);
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        //判断是否为系统预装的应用
            if ((mPackageInfo.applicationInfo.flags & mPackageInfo.applicationInfo.FLAG_SYSTEM) <= 0 ) {
                //第三方应用
                b = true;
            } else
            {
                //系统应用
            }
        return  b;
    }
}
在application中调用
public class MyApplication extends Application{
    @Override
    public void onCreate() {
        super.onCreate();
        startService(new Intent(this, ListenerService.class));
    }
}
最后,在清单文件中注册,并添加权限
 
    
        
            
                
                
            
        
        
    



你可能感兴趣的:(Android监听进入和退出第三方应用)