如何打开某些特定打开的应用程序并启动它

时间:2018-12-28 13:46:34

标签: android android-intent android-manifest launcher

我想跟踪一个应用程序,例如“ com.facebook.katana”,我已经有了它的包名,现在我的问题是,我要调用我的应用程序,并在该应用程序(“ com.facebook。 katana“)打开,好吧,让我们开始吧,我正在制作一个App储物柜,但我只想锁定此App(” com.facebook.katana“)!我会做其他事情,但在该应用启动时只需要帮助即可启动我的活动! 预先感谢!

我当前正在使用此代码:

        ActivityManager mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
    List<ActivityManager.RunningTaskInfo> RunningTask = mActivityManager.getRunningTasks(1);
    ActivityManager.RunningTaskInfo ar = RunningTask.get(0);

    String activityOnTop = ar.topActivity.getClassName ();

1 个答案:

答案 0 :(得分:1)

TL; DR;

您将必须创建一个Service,它要定期检查哪个是前景Activity以及它是否属于ActivityManager属于com.facebook.katana

如果是这样,请启动您的储物柜Activity

您的代码没问题,只需将其放入我上面描述的服务中即可。

请注意,如果您要定位Oreo +,则必须将其作为前台服务。

LR

因此,在Android中,当您想定期执行某项工作而不将应用程序显示在屏幕顶部时(这意味着您的应用程序处于后台或什至没有启动),您可以选择多个选项,这称为scheduling tasks

我在这里为您提供的选项是Service,出于多种原因,您可能会弄清楚我每次都链接的文档。

为此,请创建一个如下服务:

class ForegroundScanService : Service() {

    val handler = Handler(Looper.getMainLooper())

    override fun onBind(intent: Intent?): IBinder? {
        return null
    }

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {  
        startForeground(1,  createNotification())
        checkApp()
        // Ended
        return START_STICKY
    }

    fun checkApp() {
        // Detect if the target app is on top, if yes invoke your app with an intent if it hasn't been done already
        if(appIsDetected()) {
            startYourApp()
        }
        // Ask the system to restart us, there are many ways to do this, each one will impact the battery in a different way
        handler.postDelayed(object: Runnable() {
            override fun run() {
                checkApp()
            }
        }, 5000);
    }

}

然后在清单中声明它,然后从您的应用活动中启动它。 由于服务将继续存在并持续运行,因此“最佳”方法是使用ForegroundService。如果您不这样做,而是选择使用WorkManager或AlarmManager或其他工具,则对电池来说更好,但重新启动时间有限。

希望它对您有所帮助,即使您选择的不是实现,也可以理解它的工作方式。

通过这种方式,您可以找到有关Handler here的文档