Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Broadcast Receiver to detect application start

I want to capture the time whenever a user starts any application using my broadcast receiver. is it possible that a broadcast receiver can catch such an event?? if yes , is there any permision which can do that?

like image 930
jehan Avatar asked Nov 09 '11 06:11

jehan


People also ask

When would you use a broadcast receiver?

Broadcast in android is the system-wide events that can occur when the device starts, when a message is received on the device or when incoming calls are received, or when a device goes to airplane mode, etc. Broadcast Receivers are used to respond to these system-wide events.

How do you trigger a broadcast receiver?

Creating a BroadcastReceiverThe onReceiver() method is first called on the registered Broadcast Receivers when any event occurs. The intent object is passed with all the additional data. A Context object is also available and is used to start an activity or service using context. startActivity(myIntent); or context.

What is the difference between a broadcast receiver and an intent filter?

An IntentFilter specifies the types of intents to which an activity, service, or broadcast receiver can respond to by declaring the capabilities of a component. BroadcastReceiver does not allows an app to receive video streams from live media sources.

How broadcast receiver works explain in detail?

Definition. A broadcast receiver (receiver) is an Android component which allows you to register for system or application events. All registered receivers for an event are notified by the Android runtime once this event happens.


2 Answers

The best you can do is create a STICKY Service that tracks all of the running application.

 @Override
public int onStartCommand(Intent intent, int flags, int startId) 
{

    Timer timer  =  new Timer();
    timer.scheduleAtFixedRate(new TimerTask() {

        public void run() 
        {
            final ActivityManager activityManager  =  (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
            final List<RunningTaskInfo> services  =  activityManager.getRunningTasks(Integer.MAX_VALUE);
                 for (int i = 0; i < services.size(); i++) {
                     if(!stalkList.contains(services.get(i).baseActivity.getPackageName()))
                     {
                          // you may broad cast a new application launch here.  
                          stalkList.add(services.get(i).baseActivity.getPackageName());
                     }
                }

                 List<RunningAppProcessInfo> procInfos = activityManager.getRunningAppProcesses();
                for(int i = 0; i < procInfos.size(); i++) {  

                    ArrayList<String> runningPkgs = new ArrayList<String>(Arrays.asList(procInfos.get(i).pkgList));

                    Collection diff = subtractSets(runningPkgs, stalkList); 

                    if(diff != null)
                    {
                        stalkList.removeAll(diff);
                    }
               }


        }
    }, 20000, 6000);  // every 6 seconds


    return START_STICKY;
}




private RunningAppProcessInfo getForegroundApp() {
    RunningAppProcessInfo result = null, info = null;

    final ActivityManager activityManager  =  (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);

    List <RunningAppProcessInfo> l = activityManager.getRunningAppProcesses();
    Iterator <RunningAppProcessInfo> i = l.iterator();
    while(i.hasNext()) {
        info = i.next();
        if(info.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND
                && !isRunningService(info.processName)) {
            result = info;
            break;
        }
    }
    return result;
}    

private boolean isRunningService(String processName) {
    if(processName == null)
        return false;

    RunningServiceInfo service;

    final ActivityManager activityManager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);

    List <RunningServiceInfo> l = activityManager.getRunningServices(9999);
    Iterator <RunningServiceInfo> i = l.iterator();
    while(i.hasNext()){
        service = i.next();
        if(service.process.equals(processName))
            return true;
    }
    return false;
}    

private boolean isRunningApp(String processName) {
    if(processName == null)
        return false;

    RunningAppProcessInfo app;

    final ActivityManager activityManager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);

    List <RunningAppProcessInfo> l = activityManager.getRunningAppProcesses();
    Iterator <RunningAppProcessInfo> i = l.iterator();
    while(i.hasNext()){
        app = i.next();
        if(app.processName.equals(processName) && app.importance != RunningAppProcessInfo.IMPORTANCE_SERVICE)
            return true;
    }
    return false;
}


private boolean checkifThisIsActive(RunningAppProcessInfo target){
    boolean result = false;
    ActivityManager.RunningTaskInfo info;

    if(target == null)
        return false;

    final ActivityManager activityManager = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);

    List <ActivityManager.RunningTaskInfo> l = activityManager.getRunningTasks(9999);
    Iterator <ActivityManager.RunningTaskInfo> i = l.iterator();

    while(i.hasNext()){
        info=i.next();
        if(info.baseActivity.getPackageName().equals(target.processName)) {
            result = true;
            break;
        }
    }

    return result;
}  


// what is in b that is not in a ?
public static Collection subtractSets(Collection a, Collection b)
{
    Collection result = new ArrayList(b);
    result.removeAll(a);
    return result;
}
like image 151
Reno Avatar answered Oct 21 '22 23:10

Reno


You can't get a broadcast when someone starts any other app. The only thing you can do is start a service that polls and periodically checks if new apps have been started (using Reno's code above for example).

Also if you start this service when the phone starts you have a reasonably good solution.

like image 26
Sunkas Avatar answered Oct 21 '22 21:10

Sunkas