记录Android中已启动的活动

web*_*o80 6 android intentfilter android-intent android-activity

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

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

想要得到一些类似的:

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

提前致谢

编辑 - 只需看看该应用程序MyAppRank,这完全是我的意思

Vin*_*nay 5

从您的问题中我能弄清楚的是,您希望跟踪在应用程序中启动的所有活动。如果正确,那么该解决方案可能对您有用:

  1. 创建一个BaseActivity,您所有的Activity应该扩展

    public class BaseActivity extends Activity
    
    Run Code Online (Sandbox Code Playgroud)

    {

    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);
    }
    
    Run Code Online (Sandbox Code Playgroud)

    }

  2. 现在,将BaseActivity扩展到所有活动之上。即不是扩展您的活动,而是扩展BaseActivity并调用setActivity(this); 在如下所示的onCreate中:

    public class MyActivity extends Activity
    
    Run Code Online (Sandbox Code Playgroud)

{

     @Override      
      protected void onCreate(Bundle savedInstanceState)

    {

        super.onCreate(savedInstanceState);

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

}
Run Code Online (Sandbox Code Playgroud)

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, "");
    }
}}  
Run Code Online (Sandbox Code Playgroud)

4最后,在您的AndroidManifest.xml中的Receiver上方注册

    <receiver
        android:name="TrackActivitiesReceiver"
        android:exported="false" >
        <intent-filter>
            <action android:name="INTENTFILTER_TRACK_MY_ACTIVITIES" />
        </intent-filter>
    </receiver>
Run Code Online (Sandbox Code Playgroud)

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

  • 我了解他需要保持统计信息,以便从设备(无论应用程序)启动所有活动。 (2认同)

Dav*_*ser 1

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

执行此操作的方法(MyAppRank 等应用程序就是这样做的)是使用以下方法ActivityManager

getRunningTasks()
getRunningAppProcesses()
getRecentTasks()
Run Code Online (Sandbox Code Playgroud)

您创建一个Service始终运行的任务,并定期调用 的方法来ActvityManager确定哪个任务位于前台,并且您可以“推断”用户已完成(或正在执行)的操作。这不是一门精确的科学。

注意:android.permission.GET_TASKS从 API 21(Android 5、Lollipop)开始,您将需要这些,但这些都不再起作用。从 API 21 开始,安全性已得到加强,应用程序只能获取有关其自身任务的信息,而无法获取系统中其他任务的信息。