Android 知識點 集錦

Merbng發表於2019-03-08

1.自定義Handler時如何避免記憶體洩露

一般非靜態內部類持有外部類的引用的情況下,造成外部類在使用完成後不能被系統回收記憶體,從而造成記憶體洩露,為了避免這個問題,我們可以自定義Handler宣告為靜態內部類形式,然後通過弱引用的方式,讓Handler持有外部類的引用,從而避免記憶體洩露問題。

public class MyHandler extends Handler {
    private MainActivity activity;

    public MyHandler(WeakReference<MainActivity> ref) {
        this.activity = ref.get();
    }

    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        switch (msg.what) {
            case 1:
                if (activity != null) {
                    activity.mText.setText("xxx");
                }
                break;
        }
    }
}
public class MainActivity extends AppCompatActivity {
public TextView mText;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        WeakReference<MainActivity> reference = new WeakReference<>(this);
        MyHandler myHandler = new MyHandler(reference);
        myHandler.sendEmptyMessage(1);
}
}
複製程式碼

2.onNewIntent()呼叫時機

預設情況下,通過Intent啟動一個Activity的時候,就算存在一個已經正在執行的Activity,系統都會建立一個新的Activity例項並顯示出來,為了不讓Activity例項化多次,我們需要通過配置AndroidManifest.xml 裡面Activity的載入方式(launcheMode)以實現單任務模式。

        <activity
            android:name=".app.MainActivity"
            android:launchMode="singleTask">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
複製程式碼

launcheModesingleTask的時候,通過Intent啟動一個Activity,如果系統已經存在一個例項(已經開啟過這個Activity),系統將會將請求傳送到這個例項上,但這個時候,就不會呼叫onCreate了,而是呼叫onNewIntent 需要注意的是,當前設定了啟動模式的這個activity已經啟動過並在當前應用的堆疊中。

  • ActivityAlauncheModesingleTop時,如果ActivityA棧頂,且現在要啟動ActivityA,這時就會呼叫**onNewIntent()**方法
  • ActivityAlauncheModesingleInstance,singleTask時,如果ActivityA已經在堆疊中,那麼此時會呼叫**onNewIntent()**方法

例子:

  1. 設定MainActivity的啟動模式為singleTask(棧內複用)
        <activity
            android:name=".app.MainActivity"
            android:launchMode="singleTask">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

複製程式碼
  1. MainActivity中重寫**onNewIntent()**方法
    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        Bundle bundle = intent.getExtras();
        Log.e("","傳過來的資料")
    }

複製程式碼

2019年3月8日10:06:05

相關文章