【问题标题】:how to check the top activity from android app in background service如何在后台服务中检查android应用程序的顶级活动
【发布时间】:2013-12-23 09:22:44
【问题描述】:

在我的应用程序中,我想检查是否有任何其他应用程序从我的应用程序启动。所以我目前正在使用 Activitymanager 来查找像这样的顶级活动

ActivityManager am = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);
List< ActivityManager.RunningTaskInfo > taskInfo = am.getRunningTasks(1);
Log.d("topActivity", "CURRENT Activity ::"
         + taskInfo.get(0).topActivity.getClassName());
ComponentName componentInfo = taskInfo.get(0).topActivity;
componentInfo.getPackageName();

但我想在后台服务中运行此代码。这样我就可以检测到其他应用程序何时通过此启动。所以有什么想法可以做到这一点。请帮助我。谢谢

【问题讨论】:

标签: android android-service


【解决方案1】:

通过使用服务,您可以实现这一目标..

public void checkActivity() {
    handler = new Handler();
    activityRunnable = new ActivityRunnable();
    handler.postDelayed(activityRunnable, 500);
}

private class ActivityRunnable implements Runnable {
    @Override
    public void run() {
        ActivityManager manager = (ActivityManager) getApplicationContext()
                .getSystemService(Context.ACTIVITY_SERVICE);
        List<RunningTaskInfo> runningTasks = manager.getRunningTasks(1);
        if (runningTasks != null && runningTasks.size() > 0) {
            ComponentName topActivity = runningTasks.get(0).topActivity;
            // Here you can get the TopActivity for every 500ms
            if(!topActivity.getPackageName().equals(getPackageName())){
                // Other Application is opened
            }
            handler.postDelayed(this, 500);
        }
    }
}

service 的onCreate 中调用checkActivity(),不要忘记删除onDestroy 中的handler.removeCallbacks(activityRunnable); 回调

在 LauncherActivity onCreate 中启动服务并在 LauncherActivity onDestroy 中停止服务

注意:不要忘记在清单中添加权限

<uses-permission android:name="android.permission.GET_TASKS" />

【讨论】:

  • 嘿,谢谢你的回复。如果我会使用它,那么它会在每 500 毫秒内一次又一次地启动。所以还有其他可能性,以便我可以检查用户是否打开了任何其他应用程序。这样我可以为用户打开该特定应用程序而祝酒。
  • 然后启动服务,用户可以从您的应用程序启动第三方应用程序...或者@Martin 说...您可以按照这种方法
  • 似乎已被弃用,在 Lollipop 中不起作用 code.google.com/p/android-developer-preview/issues/…
【解决方案2】:

您应该为此使用服务。然后只有你可以实现后台进程..请通过 about Services http://developer.android.com/guide/components/services.html 你也可以看到http://www.vogella.com/articles/AndroidServices/article.html 这两个 URL 都会帮助你

【讨论】:

  • 是的..他想在后台进程中检查..所以,我发布了那个网址..这有什么问题????
  • 我想在服务类中运行这段代码。很好。但是在哪个方法中。在 oncreate 或 onstart 或 onstartcommand 中。所以每当我从一个活动切换到另一个活动时,我都会得到一个吐司。
  • 他的代码不正确,您稍后添加了链接。仍然重要的是,他不应该在服务中运行该代码,因为它不起作用(而且他根本不应该运行该代码,因为它是错误的)。我传递的链接中解释了让服务知道应用程序是否进入后台的正确方法。服务与问题无关。
  • 实际上我想在用户打开 gtalk 应用程序时收到一条祝酒消息。这就是我想要的。所以如果可能的话,任何帮助都会感谢。谢谢 arun
  • 例如这个 GTalk 应用程序已经从你的应用程序中打开..那么只有你会得到 Toast 对吗??
【解决方案3】:

代替服务使用receiver来接收启动事件 在那里你可以实现这个代码。

【讨论】:

    【解决方案4】:

    您采用的方法是错误的,并且很容易让您的应用被 Google Play 商店拒绝(而且它可能会停止工作)。

    检查this thread 以查看检测您的应用是否进入后台的可能方法。

    【讨论】:

    • 你好马丁谢谢你的回复。但我的问题是我想在服务类中运行这段代码。所以我将在哪种方法中运行这段代码,以便它可以在后台运行很长时间。跨度>
    • 问题不在于你在哪里运行代码,而在于代码本身。您编写的代码(您在谷歌搜索后复制和粘贴的代码)不正确。 getRunningTasks 方法不适用于生产代码(阅读 ActivityManager 文档以获取正确解释的更多信息)。如果您想知道您的应用程序在后台时的服务级别,只需使用特定事件调用您的服务,说明应用程序进入后台/前台,并将其保存在服务的局部变量中。不要在不了解其作用的情况下复制/粘贴代码。
    • 哦,确切地说,当其他应用程序启动时,我想从我的应用程序中获得一条祝酒消息。有可能
    • 您可能知道应用的 UI 何时被隐藏且不再可见。请花 20 多秒时间阅读我喜欢的主题和 Arun 喜欢的服务文档。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-18
    • 1970-01-01
    • 2013-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多