本篇文章基本实现,监听进入和退出第三方应用的功能。经验不足,有问题之处,欢迎留言指出,先三克油了。参考文章http://blog.youkuaiyun.com/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>