Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Keep record of launched activities in Android

I was wondering how to keep a record of launched activites for logging purposes. what broadcast receiver I have to subscribe to intercept this intent? or what intent-filter to use? I figure that I must use some type of long-running service in the background.

My first objetive is to track main-focus applications, some sort of history.

Want to get finally some similar to:

  • - Launched app com.android.xxx
  • - Launched app xx.yy.zz
  • - App xx.yy.zz lost focus

Thanks in advance

EDIT - Just see that app MyAppRank , that does exactly what i mean

like image 560
webo80 Avatar asked Jun 20 '13 08:06

webo80


People also ask

In which file the Android launching activity is declared?

To declare your activity, open your manifest file and add an <activity> element as a child of the <application> element. For example: <manifest ... > The only required attribute for this element is android:name, which specifies the class name of the activity.

What is onStop Android?

onStop() Method In Android Activity Life Cycle When Activity is in background then onPause() method will execute. After a millisecond of that method next onStop() method will execute. Means here also Activity is not visible to user when onStop() executed. We will use onStop() method to stop Api calls etc.

What does finish () do in Android?

On Clicking the back button from the New Activity, the finish() method is called and the activity destroys and returns to the home screen.


2 Answers

What i'm able to figure out from your question is that you want to keep track of all the activities when they are launched in your application. If that is correct, the solution may work for you:

  1. Crate a BaseActivity which all of your Activities should extend

    public class BaseActivity extends Activity
    

    {

    private Activity activity;
    
    public static final String INTENTFILTER_TRACK_MY_ACTIVITIES="INTENTFILTER_TRACK_MY_ACTIVITIES";
    public static final String INTENTFILTER_REMOVE_MY_ACTIVITIES="INTENTFILTER_REMOVE_MY_ACTIVITIES";
    
    public void setActivity(Activity act)
    {
        activity = act;
    }
    
    public Activity getActivity()
    {
        return activity;
    }
    
    @Override protected void onCreate(Bundle savedInstanceState)
    {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        Intent intent = new Intent();
        intent.setAction(INTENTFILTER_TRACK_MY_ACTIVITIES);
        intent.putExtra("activityName", activity.getClass().getSimpleName());
        sendBroadcast(intent);
    }
    
    @Override protected void onDestroy()
    {
        // TODO Auto-generated method stub
        super.onDestroy();
        Intent intent = new Intent();
        intent.setAction(INTENTFILTER_REMOVE_MY_ACTIVITIES);
        intent.putExtra("activityName", activity.getClass().getSimpleName());
        sendBroadcast(intent);
        setActivity(null);
    }
    

    }

  2. Now extend above BaseActivity for all your activities. i.e instead of extending your Activities should extend BaseActivity and call setActivity(this); in onCreate like below:

    public class MyActivity extends Activity
    

{

     @Override      
      protected void onCreate(Bundle savedInstanceState)

    {

        super.onCreate(savedInstanceState);

        setActivity(this);
        //write your other code form here
    }

}

3.Then write a BroadcastReceiver like below:

   class TrackActivitiesReceiver extends BroadcastReceiver
    {

private static final Object SEPERATOR = ",";// use , as seperator 
String sb="";
@Override
public void onReceive(Context context, Intent intent)
{
    if(intent.getAction().equalsIgnoreCase(BaseActivity.INTENTFILTER_TRACK_MY_ACTIVITIES))
    {
        sb+=intent.getStringExtra("activityName");
        sb+=SEPERATOR;
    }
    else if(intent.getAction().equalsIgnoreCase(BaseActivity.INTENTFILTER_REMOVE_MY_ACTIVITIES))
    {
        sb=sb.replace(intent.getStringExtra("activityName")+SEPERATOR, "");
    }
}}  

4Finally, Register above Receiver in your AndroidManifest.xml

    <receiver
        android:name="TrackActivitiesReceiver"
        android:exported="false" >
        <intent-filter>
            <action android:name="INTENTFILTER_TRACK_MY_ACTIVITIES" />
        </intent-filter>
    </receiver>

Hope this solves your problem. cheers!

like image 107
Vinay Avatar answered Oct 07 '22 13:10

Vinay


There are no Intents broadcast when applications are started or when applications come to the foreground. There isn't anything that you can hook into as a listener to get these events.

The way you can do this (which is the way apps like MyAppRank do it) is to use the methods of the ActivityManager:

getRunningTasks()
getRunningAppProcesses()
getRecentTasks()

You create a Service which runs all the time and at regular intervals calls methods of the ActvityManager to determine which task is in the foreground and you can "infer" what the user has done (or is doing). It isn't an exact science.

Note: You will need android.permission.GET_TASKS and none of this works anymore as of API 21 (Android 5, Lollipop). As of API 21 the security has been tightened and an application can only get information about its own tasks, not other tasks in the system.

like image 38
David Wasser Avatar answered Oct 07 '22 11:10

David Wasser