web*_*o80 6 android intentfilter android-intent android-activity
我想知道如何记录已启动的活动以进行日志记录.我必须订阅什么广播接收器来拦截这个意图?或者使用什么意图过滤器?我认为我必须在后台使用某种类型的长时间运行服务.
我的第一个目标是跟踪主要焦点应用程序,某种历史.
想要得到一些类似的:
提前致谢
编辑 - 只需看看该应用程序MyAppRank,这完全是我的意思
从您的问题中我能弄清楚的是,您希望跟踪在应用程序中启动的所有活动。如果正确,那么该解决方案可能对您有用:
创建一个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)
}
现在,将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)
希望这能解决您的问题。干杯!
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 开始,安全性已得到加强,应用程序只能获取有关其自身任务的信息,而无法获取系统中其他任务的信息。
归档时间: |
|
查看次数: |
779 次 |
最近记录: |