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<ActivityManager.RunningTaskInfo> 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<String> 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<ActivityManager.RunningTaskInfo> 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));
    }
}
最后,在清单文件中注册,并添加权限
 <uses-permission android:name="android.permission.GET_TASKS"/>
    <application
        android:persistent="true"
        android:name=".MyApplication"
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name="com.closeness.comment.MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
        <service android:name="com.closeness.comment.ListenerService"/>
    </application>



  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值