如何通知一个Activity刚刚启动另一个Activity?

时间:2010-03-31 01:01:52

标签: android android-activity

我只是希望获得每个活动使用的次数。 因此,我认为非常直接的方法是在活动开始时增加活动的计数。但我怎样才能获得这些信息?

感谢您的大力帮助!

4 个答案:

答案 0 :(得分:2)

最后,我找到了一个解决方案,使用了IActivityWatcher和ActivityManagerNative,并构建了源代码。

非常感谢T3Roar,我只是按照你的线索找到它。

以下示例代码:

package zouyu.sample.activitymonitor;

import android.app.Activity;
import android.app.ActivityManagerNative;
import android.app.IActivityWatcher;
import android.os.Bundle;
import android.os.RemoteException;
import android.util.Log;

public class ActivityMonitor extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        try {
            ActivityManagerNative.getDefault().registerActivityWatcher(mActivityWatcher);
        } catch (RemoteException e) {
        }
    }

    private IActivityWatcher.Stub mActivityWatcher = new IActivityWatcher.Stub() {
        public void activityResuming(int activityId) throws RemoteException {
            Log.e("zouyu", "In ActivityMonitor, an Activity resuming: " + activityId);
        }

        public void closingSystemDialogs(String reason) {
            Log.e("zouyu", "In ActivityMonitor, an Activity closing: " + reason);
        }
    };
}

答案 1 :(得分:1)

我确信这是可能的,因为像Protector Demo这样的应用程序能够监听打开的应用程序。

在Android“Spare Parts”应用程序中(它位于模拟器中,但可能不在任何商用手机上),有一个名为“Usage Statistics”的部分。它不仅记录了应用程序打开的次数,还记录了它们打开的总数。

我不知道它会如何实现。我最好的猜测是从系统中提取信息,尽管其他可能性是Intent监听器或广播接收器。

备件来源在这里,如果你想看看:

https://android.googlesource.com/platform/development/+/gingerbread-release/apps/SpareParts/src/com/android/spare_parts/SpareParts.java

答案 2 :(得分:0)

您可以使用活动生命周期方法来了解它们何时被创建以及何时恢复它们等。不确定您是在创建它时(onCreate)还是恢复它或重新开始焦点(onResume)。

就个人而言,我是子类活动和应用程序。对于子类应用程序,您必须记住在清单中声明Application的类名。应用程序可以有一个由Activity名称键入的HashMap,其int值是每个活动恢复或创建的次数(或任何你想要的)。

您当前的所有活动都来自Activity类。因此,您可以创建自己的ActivityBase来扩展Activity并为onCreate和onResume添加覆盖方法。这些重写的方法将调用Application类上的方法来告诉它增加计数。然后,您的所有活动都将扩展ActivityBase而不是Activity。

答案 3 :(得分:0)

如果您是Android OEM开发人员/合作伙伴,则可以使用IActivityController.Stub来获取所需内容。然后,您可以使用如下的ActivityManagerNative开始接收事件。

ActivityManagerNative.getDefault().setActivityController(activityController);

您需要在某处保存白名单/黑名单首选项,并与IActivityController.Stub回调中的包进行比较。如,

public boolean activityStarting(Intent intent, String pkg) {
    Slog.d(AdbLogTag.TAG, "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
    Slog.i(AdbLogTag.TAG, String.format("Application starting {intent=%s}, pkg=%s", intent, pkg));
    Slog.d(AdbLogTag.TAG, "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++");

希望这会有所帮助。