监听系统任意一个app启动代码

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012259618/article/details/52195675

在项目开发中碰到一个问题,需要监听到任意一个app打开,不管是手动打开还是自动跳转到别的apk,都可以捉取到启动信息。参考了一些资料发现有两种方式。第一种:实现IActivityController.Stub这个类,系统本身有这个接口可以调用的,但是因为系统是隐藏该接口的,所以需要自己实现它。继承了这个类后它会重写activityStarting,这个可以抓取任意启动的app的包名。代码如下:

public class ServiceTest extends Service{

         privatestatic final String HIDE_ACTION = "com.jsr.HIDE_FLOATVIEW";

         IActivityManagermgr;

         @Override

         publicIBinder onBind(Intent arg0) {

                   //TODO Auto-generated method stub

                   returnnull;

         }

         @Override

         publicvoid onCreate() {

                   //TODO Auto-generated method stub

                   super.onCreate();

                   Log.i("liting", "oncreate");

                   mgr= ActivityManagerNative.getDefault();

                   try{

                            mgr.setActivityController(new ActivityController());

                   }catch(RemoteExceptione){

                           

                   }

         }

         privateclass ActivityController extendsIActivityController.Stub{

                   publicboolean activityStarting(Intentintent, String pkg) {

                            Log.i("liting","start---pkg= " + pkg);       

                            if("com.android.floatview".equals(pkg)){}else{

                                     Intentintent_flow = new Intent();

                                         intent_flow.setAction(HIDE_ACTION);

                                     //intent_flow.putExtra("camera","black");

                                         sendBroadcast(intent_flow);

                            }

                            returntrue;

                   }

                   publicboolean activityResuming(Stringpkg) {

                            Log.i("liting","activityResumingpkg = " + pkg);

                            returntrue;

                   }

                   publicint appEarlyNotResponding(StringprocessName, int pid,

                                     Stringannotation) {

                                     Log.i("liting","appEarlyNotResponding");

                            return0;

                   }

                   publicboolean appCrashed(StringprocessName, int pid, String shortMsg,

                                     StringlongMsg, long timeMillis, String stackTrace) {

                                     Log.i("liting","appCrashedprocessName = " + processName);                                

                            returnfalse;

                       }

                   publicint appNotResponding(StringprocessName, int pid,

                                     StringprocessStats) {

                                     Log.i("liting","appNotResponding");

                            return0;

                   }

                   publicint systemNotResponding(StringprocessName) {

                            Log.i("liting","systemNotResponding");

                            return0;

                   }

         }

}

第二种方法比较简单和方便,在frameworks\base\services\core\java\com\android\server\am\ActivityStackSupervisor.java代码里,在Logcat里每次点击系统某一应用,都会触发该事件:

Slog.i(TAG,"START u" + userId + " {" + intent.toShortString(true,true, true, false)

                    + "} from uid " +callingUid

                    + " on display "+ (container == null ? (mFocusedStack == null ?

                           Display.DEFAULT_DISPLAY : mFocusedStack.mDisplayId) :

                           (container.mActivityDisplay == null ? Display.DEFAULT_DISPLAY :

                                    container.mActivityDisplay.mDisplayId)));

通过找到该位置,可以在里面添加广播,过滤掉不要的应用:

final int startActivityLocked(IApplicationThread caller,

           Intent intent, String resolvedType, ActivityInfo aInfo,

           IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,

           IBinder resultTo, String resultWho, int requestCode,

           int callingPid, int callingUid, String callingPackage,

           int realCallingPid, int realCallingUid, int startFlags, Bundle options,

           boolean componentSpecified, ActivityRecord[] outActivity,ActivityContainer container,

           TaskRecord inTask) {

      …………

       if (err == ActivityManager.START_SUCCESS) {

                            if(JSRConfig.J_N2800) {

                                     String name= aInfo.applicationInfo.processName;

                                     if("com.android.floatview".equals(pkg)){}else{

                                               Intentintent_flow = new Intent();

                                               intent_flow.setAction(HIDE_ACTION);

                                               //intent_flow.putExtra("camera","black");

                                               sendBroadcast(intent_flow);

                                     }

                                     Slog.i(TAG,"liting----name= " + name);

                            }


猜你喜欢

转载自blog.csdn.net/u012259618/article/details/52195675