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


当前回答

getCurrentActivity()也在ReactContextBaseJavaModule中。 (因为这个问题最初被问到,许多Android应用程序也有ReactNative组件-混合应用程序。)

ReactNative中的类ReactContext有一整套逻辑来维护在getCurrentActivity()中返回的mCurrentActivity。

注:我希望getCurrentActivity()在Android应用程序类中实现。

其他回答

使用is操作符或其否定形式!is执行运行时检查,确定对象是否符合给定类型:

if (this !is OneActivity) {
// do something
} else if (this !is TwoActivity) {
// do something 2
}

一个相当简单的解决方案是创建一个单例管理器类,你可以在其中存储一个或多个活动的引用,或者你想在整个应用程序中访问的任何其他东西。

调用UberManager.getInstance()。setMainActivity(activity);在主活动的onCreate中。

.getMainActivity调用UberManager.getInstance () ();在应用程序的任何地方检索它。(我使用这个能够使用吐司从一个非UI线程。)

确保您添加了对UberManager.getInstance().cleanup()的调用;当你的应用程序被销毁时。

import android.app.Activity;

public class UberManager
{
    private static UberManager instance = new UberManager();

    private Activity mainActivity = null;

    private UberManager()
    {

    }

    public static UberManager getInstance()
    {
        return instance;
    }

    public void setMainActivity( Activity mainActivity )
    {
        this.mainActivity = mainActivity;
    }

    public Activity getMainActivity()
    {
        return mainActivity;
    }

    public void cleanup()
    {
        mainActivity = null;
    }
}

通过使用这部分代码,您可以检测应用程序何时进入后台/前台,并访问当前活动名称和上下文。

我的答案是基于这篇文章:Android:如何检测App进入后台/前台

首先,创建一个扩展android.app.Application并实现ActivityLifecycleCallbacks接口的类。在Application.onCreate()中,注册回调。

public class App extends Application implements ActivityLifecycleCallbacks
@Override
public void onCreate() {
    super.onCreate();
    registerActivityLifecycleCallbacks(this);
}

在Manifest中注册“App”类,如下所示:

<application
    android:name=".App"

这就是ActivityLifecycleCallbacks接口的样子,

public interface ActivityLifecycleCallbacks {
    void onActivityCreated(Activity activity, Bundle savedInstanceState);
    void onActivityStarted(Activity activity);
    void onActivityResumed(Activity activity);
    void onActivityPaused(Activity activity);
    void onActivityStopped(Activity activity);
    void onActivitySaveInstanceState(Activity activity, Bundle outState);
    void onActivityDestroyed(Activity activity);
}

因此,当您的任何活动(您创建或包含在库中的活动)通过上述任何生命周期方法时,这些回调将被调用。 当应用程序在前台时,至少有一个Activity处于启动状态,当应用程序在后台时,将没有Activity处于启动状态。 在“App”类中声明如下2个变量。

private int activityReferences = 0;
private boolean isActivityChangingConfigurations = false;

activityReferences将保存处于启动状态的activity的数量。isActivityChangingConfigurations是一个标志,用于指示当前Activity是否正在经历配置更改,如方向切换。 使用下面的代码,你可以检测应用程序是否出现在前台。

@Override
public void onActivityStarted(Activity activity) {
    if (++activityReferences == 1 && !isActivityChangingConfigurations) {
        // App enters foreground
    }
}

你可以在这个方法中像这样访问context:

activity.getBaseContext()

这是如何检测应用程序是否进入后台。

Override
public void onActivityStopped(Activity activity) {

    isActivityChangingConfigurations = activity.isChangingConfigurations();
    if (--activityReferences == 0 && !isActivityChangingConfigurations) {
        // App enters background
    }
}

现在您可以访问当前的前台活动名称和上下文。

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

用法:

    //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)

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

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

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

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