记录Android中已启动的活动

时间:2013-06-20 08:12:51

标签: android android-intent android-activity intentfilter

我想知道如何记录已启动的活动以进行日志记录。我必须订阅什么广播接收器来拦截这个意图?或者使用什么意图过滤器?我认为我必须在后台使用某种类型的长期服务。

我的第一个目标是跟踪主要焦点应用程序,某种历史。

想要最终得到一些类似的:

  • - 推出app com.android.xxx
  • - 推出了应用xx.yy.zz
  • - App xx.yy.zz迷失焦点

提前致谢

编辑 - 只需查看该应用MyAppRank,这完全符合我的意思

2 个答案:

答案 0 :(得分:4)

我能够从您的问题中弄清楚,您希望跟踪在您的应用中启动时的所有活动。如果这是正确的,该解决方案可能适合您:

  1. 创建所有活动应扩展的 BaseActivity

    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. 现在扩展到BaseActivity以上的所有活动。而不是扩展你的活动应该扩展BaseActivity并在onCreate中调用 setActivity(this); ,如下所示:

    public class MyActivity extends Activity
    
  3. {

         @Override      
          protected void onCreate(Bundle savedInstanceState)
    
        {
    
            super.onCreate(savedInstanceState);
    
            setActivity(this);
            //write your other code form here
        }
    
    }
    

    3.然后编写如下的BroadcastReceiver:

       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, "");
        }
    }}  
    

    4最后,在AndroidManifest.xml中注册Receiver以上

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

    希望这能解决您的问题。干杯!

答案 1 :(得分:1)

启动应用程序或应用程序到达前台时,没有Intent广播。没有任何东西可以作为听众来吸引这些事件。

你可以这样做的方式(就像MyAppRank之类的应用程序那样)是使用ActivityManager的方法:

getRunningTasks()
getRunningAppProcesses()
getRecentTasks()

您创建一个Service,它会一直运行并定期调用ActvityManager的方法来确定哪个任务位于前台,您可以“推断”用户所做的事情(或是在做)。这不是一门精确的科学。

注意:从API 21(Android 5,Lollipop)开始,您将需要android.permission.GET_TASKS并且这些都不再适用。从API 21开始,安全性已经收紧,应用程序只能获取有关其自身任务的信息,而不是系统中的其他任务。