轉(zhuǎn)載請注明出處啡捶,謝謝??http://blog.csdn.net/harryweasley/article/details/46557827
因為項目中,有一個消息推送的功能奸焙,每次推送一個消息瞎暑,就會開啟FunctionActivity,那么為了避免重復(fù)開啟它与帆,在退后的時候了赌,多次出現(xiàn)該Activity,就將該Activity的啟動模式變?yōu)閟ingleTask玄糟。
這樣在之后的多次啟動該Activity勿她,便會調(diào)用onNewIntent(Intent intent)方法。
activity通過intent傳遞數(shù)據(jù)的時候,如果activity未啟動,那么在這個剛啟動的activity里通過getIntent()會獲取到這個intent的數(shù)據(jù).如果要啟動的activity是已經(jīng)存在的,這時候通過getInten()方法獲取到的intent是已啟動的activity的原始intent.換句話說intent的數(shù)據(jù)沒有更新.這樣在已啟動的activity里拿到的intent的數(shù)據(jù)是舊數(shù)據(jù).如果要每次獲取intent傳來的新數(shù)據(jù)就需要在onNewIntent(Intent intent)方法里調(diào)用setIntent(intent)設(shè)置這個傳來的最新的intent.如下所示:
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
Log.e("tag", "onNewINtent執(zhí)行了");
setIntent(intent);
String ringName = intent.getStringExtra("ringName");
Log.e("tag", ringName+"傳過來的值");
if (ringName != null) {
pager.setCurrentItem(1);
}
}
當(dāng)然茶凳,如果activity的啟動模式是standard,那么每次都重新創(chuàng)建一個新的activity.這樣intent也是最新的.就不用通過setIntent來更新這個intent.
我這個項目中嫂拴,F(xiàn)unctionActivity中里面是四個Fragment播揪,這樣我從其他Activity跳轉(zhuǎn)到FunctionActivity是不會實例化贮喧,通過getIntent()方法也不能獲得最新的intent,為了解決這個辦法猪狈。還是在onNewIntent方法中箱沦,將更新的intent通過getIntent().putExtras(intent);共享出去,如下所示:
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
Log.e("tag", "onNewINtent執(zhí)行了");
setIntent(intent);
getIntent().putExtras(intent);
}
這樣在與它關(guān)聯(lián)的Fragment中雇庙,就可以調(diào)用
@Override
public void onResume() {
super.onResume();
// 第一次進(jìn)入這個頁面谓形,下面的方法是不會執(zhí)行的灶伊,因為ringName是null
String ringName = getActivity().getIntent().getStringExtra("ringName");
if (ringName != null) {
newSound.setText(ringName);
Log.e("tag", ringName + "要保存的值");
SharedPreferenceUtil.setString(getActivity(),
SharedPreferenceUtil.RINGTONE_NAME, ringName);
}
}
注意,這里Fragment調(diào)用的時候寒跳,一定要在onResume方法中聘萨。