首页 > 解决方案 > 在 Application 中获取 MainActivity 的引用

问题描述

我有ApplicationVTSMainActivity。我需要MainActivityApplication VTS课堂上获得参考并调用MainActivity's方法show(String t)。如何获得对aaa变量的引用?

<application
    android:name=".VTS"
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">

    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>


public class VTS extends Application 
{
MainActivity aaa;

    @Override
    public void onCreate() {
        super.onCreate();
    }
}

public class MainActivity extends AppCompatActivity {
public void show(String t)
{
//...
}

}

标签: android

解决方案


老实说,我不确定您为什么要从 Application 类调用活动的方法,但无论如何,您可以在应用程序类中设置对活动的弱引用。

我没有对此进行测试,但这是我认为可行的一种方式。为简单起见,这假设您没有处理并发问题。

public class VTS extends Application 
{
    static WeakReference<MainActivity> aaa;

    @Override
    public void onCreate() {
        super.onCreate();
    }

    public static void setMainActivity( MainActivity activity ) {
        if ( aaa != null ) {
            aaa.clear() ;
        }

        if ( activity != null ) {
            aaa = new WeakReference< MainActivity >( activity );
        }
    }
    public MainActivity getMainActivity() {
        if ( aaa == null || aaa.get() == null ) {
            Log.e("VTS", "Main activity is null");
            throw new RunTimeException("Main activity is null") ;
        }
    }

    public void someMethodThatCallsMainActivity() {
        try {
            getMainActivity().show( "Hello world!" ) ;
        } catch ( Exception e ) { 
            e/printStackTracer() ;
        }
    }
}

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate( Bundle savedInstanceState ) {
        super.onCreate( savedInstanceState );
        ...
        VTS.setMainActivity( this ) ;
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        ...
        VTS.setMainActivity( null ) ;
    }

    public void show(String t)
    {
        //...
    }

}

推荐阅读