在实际项目应用中,最近有一个需求就是进入一个特殊的应用后,系统的某个功能不能起作用。当然,这个通信有很多办法可以做到。笔者可以想到的至少有如下几种
1、利用property熟悉来实现,这样的话需要增加一个特殊的属性;
2、利用数据库,在数据库中加一条记录,进入应用的时候设置一下,在系统部分可以利用content observer或者在特殊事件来的时候先判断读取一下这个值也可以;
3、利用intent,发一个特殊的intent出来,在系统这边装一个filter;
4、利用getRunningTasks,也就是activities service的运行信息来判断;
笔者比较上面这四种,实现都是可以实现的,但是利用现有系统的一些信息来解决这个问题不是更好嘛!所以笔者选择方案4.也就是做一个接口,在该接口里面判断这个特殊的应用是不是在最前台了。这一点还是非常有用,简单代码如下:
public boolean judgeTopActivityIsReverseVideo(int status){ String topActivityClassName=null; if(am == null) am =(ActivityManager)(mContext.getSystemService(mContext.ACTIVITY_SERVICE )) ; List<RunningTaskInfo> runningTaskInfos = am.getRunningTasks(1); if(runningTaskInfos != null){ ComponentName f=runningTaskInfos.get(0).topActivity; topActivityClassName=f.getClassName(); } //Slog.d(TAG, "####topActivityClassName: "+topActivityClassName); if (topActivityClassName!=null&&topActivityClassName.startsWith("com.softwinner.reversevideo.ReverseVideo")) { if(1 == status) mReverseVideoAppEnter = true;/*In apk, reverse video comming*/ else mReverseVideoAppEnter = false;/*In apk, reverse video outgoing*/ return true; } else if(true == mReverseVideoAppEnter){ /*Enter ReverseVideo apk, reverse video signal comming,then press BACK/HOME key, apk exit, but reverse video signal not exit, so we need a flag note this special status*/ mReverseVideoAppEnter = false; return true; } return false; }
通过笔者的测试实践,该方法完全可行。