每当我的广播执行时,我想显示对前景活动的警报。


当前回答

其他答案我都不喜欢。ActivityManager不是用来获取当前活动的。超级分类和依赖onDestroy也是脆弱的,不是最好的设计。

老实说,到目前为止,我所想到的最好的方法就是在我的应用程序中维护一个枚举,它在创建活动时得到设置。

另一个建议可能是尽量避免使用多个活动。这既可以使用片段,也可以在我喜欢的自定义视图中完成。

其他回答

知道ActivityManager管理活动,所以我们可以从ActivityManager获取信息。我们得到当前的前景运行活动

ActivityManager am = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE);
ComponentName cn = am.getRunningTasks(1).get(0).topActivity;

更新2018/10/03 getRunningTasks()已弃用。请参阅下面的解决方案。

此方法在API级别21中已弃用。 从Build.VERSION_CODES开始。LOLLIPOP,这种方法不再适用于第三方应用程序:以文档为中心的最近记录的引入意味着它可能会向调用者泄露人员信息。为了向后兼容,它仍然会返回它的数据的一个小子集:至少是调用者自己的任务,可能还有一些已知不敏感的其他任务,比如home。

您可以使用这个类进行灵活的生命周期处理

用法:

    //Initialization
    val lifeCycleHandler = ActivityLifeCycleHandler<Activity>()

    //Detect only a specific type of activities
    val lifeCycleHandler = ActivityLifeCycleHandler<MainActivity>()

    //Get current activity
    val instance = lifeCycleHandler.currentReference

    //Get current activity state
    val state = lifeCycleHandler.currentState

    //Use listeners
    lifeCycleHandler.addStateChangeListener { newState ->
        //TODO: handle new state
    }

    lifeCycleHandler.addSpecificStateChangeListener(ActivityLifeCycleHandler.ActivityState.STARTED) {
        //TODO: handle new state
    }

    //Removable listeners
    val listener = { newState: Int ->

    }

    lifeCycleHandler.addStateChangeListener(listener)
    lifeCycleHandler.removeStateChageListener(listener)


    //Start listening
    App.app.registerActivityLifecycleCallbacks(lifeCycleHandler)

    //Stop listening
    lifeCycleHandler.releaseListeners()
    App.app.unregisterActivityLifecycleCallbacks(lifeCycleHandler)

如果您正在使用kotlin,那么它可以帮助您获得当前活动名称。 然而,getRecentTasks()方法在Java中已弃用。

 val am: ActivityManager = applicationContext.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
 val activityName: String = am.getRecentTasks(1, 0).get(0).topActivity.toString()

我迟到了3年,但我还是会接的,以防有人像我一样发现这个。

我解决这个问题的方法很简单:

    if (getIntent().toString().contains("MainActivity")) {
        // Do stuff if the current activity is MainActivity
    }

注意"getIntent(). tostring()"包含了一堆其他文本,比如你的包名和你的活动的任何意图过滤器。从技术上讲,我们检查的是当前的意图,而不是活动,但结果是一样的。就用Log吧。d(“测试”,getIntent () .toString ());如果你想看所有的文字。这个解决方案有点俗气,但它在你的代码中要干净得多,功能是相同的。

我在Kotlin中做了以下工作

Create Application Class Edit the Application Class as Follows class FTApplication: MultiDexApplication() { override fun attachBaseContext(base: Context?) { super.attachBaseContext(base) MultiDex.install(this) } init { instance = this } val mFTActivityLifecycleCallbacks = FTActivityLifecycleCallbacks() override fun onCreate() { super.onCreate() registerActivityLifecycleCallbacks(mFTActivityLifecycleCallbacks) } companion object { private var instance: FTApplication? = null fun currentActivity(): Activity? { return instance!!.mFTActivityLifecycleCallbacks.currentActivity } } } Create the ActivityLifecycleCallbacks class class FTActivityLifecycleCallbacks: Application.ActivityLifecycleCallbacks { var currentActivity: Activity? = null override fun onActivityPaused(activity: Activity?) { currentActivity = activity } override fun onActivityResumed(activity: Activity?) { currentActivity = activity } override fun onActivityStarted(activity: Activity?) { currentActivity = activity } override fun onActivityDestroyed(activity: Activity?) { } override fun onActivitySaveInstanceState(activity: Activity?, outState: Bundle?) { } override fun onActivityStopped(activity: Activity?) { } override fun onActivityCreated(activity: Activity?, savedInstanceState: Bundle?) { currentActivity = activity } } you can now use it in any class by calling the following: FTApplication.currentActivity()