我想知道如何记录已启动的活动以进行日志记录。我必须订阅什么广播接收器来拦截这个意图?或者使用什么意图过滤器?我认为我必须在后台使用某种类型的长期服务。
我的第一个目标是跟踪主要焦点应用程序,某种历史。
想要最终得到一些类似的:
提前致谢
编辑 - 只需查看该应用MyAppRank,这完全符合我的意思
答案 0 :(得分:4)
我能够从您的问题中弄清楚,您希望跟踪在您的应用中启动时的所有活动。如果这是正确的,该解决方案可能适合您:
创建所有活动应扩展的 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);
}
}
现在扩展到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>
希望这能解决您的问题。干杯!
答案 1 :(得分:1)
启动应用程序或应用程序到达前台时,没有Intent
广播。没有任何东西可以作为听众来吸引这些事件。
你可以这样做的方式(就像MyAppRank之类的应用程序那样)是使用ActivityManager
的方法:
getRunningTasks()
getRunningAppProcesses()
getRecentTasks()
您创建一个Service
,它会一直运行并定期调用ActvityManager
的方法来确定哪个任务位于前台,您可以“推断”用户所做的事情(或是在做)。这不是一门精确的科学。
注意:从API 21(Android 5,Lollipop)开始,您将需要android.permission.GET_TASKS
并且这些都不再适用。从API 21开始,安全性已经收紧,应用程序只能获取有关其自身任务的信息,而不是系统中的其他任务。