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.xm
l 裡面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>
複製程式碼
當launcheMode
為singleTask
的時候,通過Intent
啟動一個Activity
,如果系統已經存在一個例項(已經開啟過這個Activity
),系統將會將請求傳送到這個例項上,但這個時候,就不會呼叫onCreate
了,而是呼叫onNewIntent
需要注意的是,當前設定了啟動模式的這個activity已經啟動過並在當前應用的堆疊中。
- 當
ActivityA
的launcheMode
為singleTop時,如果ActivityA
在棧頂,且現在要啟動ActivityA
,這時就會呼叫**onNewIntent()**方法 - 當
ActivityA
的launcheMode
為singleInstance,singleTask時,如果ActivityA
已經在堆疊中,那麼此時會呼叫**onNewIntent()**方法
例子:
- 設定
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>
複製程式碼
- 在
MainActivity
中重寫**onNewIntent()**方法
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
Bundle bundle = intent.getExtras();
Log.e("","傳過來的資料")
}
複製程式碼
2019年3月8日10:06:05