【问题标题】:Keep record of launched activities in Android记录 Android 中启动的活动
【发布时间】:2013-06-20 08:12:51
【问题描述】:

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

我的第一个目标是跟踪重点应用程序,某种历史记录。

想最终得到一些类似于:

  • - 启动应用程序 com.android.xxx
  • - 启动应用 xx.yy.zz
  • - 应用 xx.yy.zz 失去焦点

提前致谢

编辑 - 看看那个应用程序 MyAppRank,这正是我的意思

【问题讨论】:

  • 您实际上需要设备上正在运行的应用程序列表吗?
  • 不,不是。我更倾向于用户打开的活动时间表/主要关注用户使用情况统计
  • 我不确定是否有用于此的 API,但我会将您的问题添加为收藏,因为您让我感到好奇
  • 谢谢!!我认为没有 API,但清单中或正在运行的服务中有一个广播接收器,用于拦截“startActivity(intent)”或类似的东西

标签: android android-intent android-activity intentfilter


【解决方案1】:

我可以从您的问题中了解到,您希望在您的应用程序中启动所有活动时跟踪它们。如果这是正确的,该解决方案可能对您有用:

  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
    

{

     @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>

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

【讨论】:

  • 我知道他需要对从设备启动的所有活动(无论应用程序)进行统计。
  • @gunar 确切地说,试图保留应用打开的记录,例如打开日历,打开推特应用程序,打开脸书...或主要关注的应用程序记录。维奈,很好的回应顺便说一句
  • 这是当今许多搜索可能正在寻找的答案
【解决方案2】:

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

您可以做到这一点的方式(这是像 MyAppRank 这样的应用程序这样做的方式)是使用 ActivityManager 的方法:

getRunningTasks()
getRunningAppProcesses()
getRecentTasks()

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

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

【讨论】:

  • 这正是我正在寻找的,(出于我的目的)5.0+ 的限制是一种耻辱,但对于安全性来说还可以。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-18
  • 2016-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多