2016-08-04 27 views
0

我有一個活動,用於偵聽首選項更改並重新加載應用程序。我正在使用recreate()來做到這一點。但我不知道如何傳遞參數,所以我採取了手動活動重新加載。重新創建活動並傳遞參數

Intent intent = getIntent(); 
finish(); 
// add in the arguments as Extras to the intent 
startActivity(intent); 

這有我想要的行爲,但活動的再創造是不順暢的用戶,因爲他們將看到活動被殺害和相同的活動重新發動。我希望用戶不知道該活動已重新啓動。所以,我的問題是我可以使用方法recreate()並仍然通過它傳遞參數。

+0

你可以使用重新創建()並保存論點sharedPreference – 7geeky

+0

是那個只有可能的方式? – fuadj

回答

2

您可以試試這種方式: 您可以使用啓動模式將您的活動重新啓動爲SingleTop並處理onNewIntent(意圖意圖)方法。這樣您就可以重新啓動活動併發送意圖,並且此活動不會被殺死,即您的活動的創建將不會被調用。

public class MainActivity extends Activity implements View.OnClickListener { 
    Button btn ; 
    String mRelaunchData ; 
    public static String TAG = "RelaunchMainActivity"; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     btn = (Button)findViewById(R.id.button); 
     btn.setOnClickListener(this); 
     Log.e(TAG, "onCreate called"); 
    } 

    @Override 
    public void onClick(View view) { 
     Log.e(TAG, "onClick called"); 
     Intent intent = new Intent("relaunch.activity.ACTIVITY_SELF_START_INTENT").setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 
     intent.putExtra("RESTART_DATA", "This is relaunch of this Activity"); 
     startActivity(intent); 
    } 

    @Override 
    protected void onNewIntent(Intent intent) { 
     super.onNewIntent(intent); 
     Log.e(TAG, "onNewIntent called"); 
     mRelaunchData = intent.getStringExtra("RESTART_DATA"); 
     Log.e(TAG, "mRelaunchData =" + mRelaunchData); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     Log.e(TAG, "onResume called"); 
     if(mRelaunchData != null){ 
      Toast.makeText(MainActivity.this, mRelaunchData, Toast.LENGTH_SHORT).show(); 
     } 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     Log.e(TAG, "onPause called"); 

    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 
     Log.e(TAG, "onStart called"); 
    } 

    @Override 
    protected void onStop() { 
     super.onStop(); 
     Log.e(TAG, "onStop called"); 
    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     Log.e(TAG, "onDestroy called"); 
    } 
} 
在AndroidManifest.xml

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

的onClick將重新啓動活性的影響。

生命週期將

-onclick

-onPause

-onNewIntent

-onResume

+0

但我想創建被調用,問題的整個重點是處理偏好更改(相當大地改變整個用戶界面),我在創建UI UI,所以我需要它被稱爲 – fuadj

+0

一種方法是創建所有onCreate和setvisibility中的視圖對重新啓動後需要的UI集合爲false,並且一旦使用onNewIntent,則使用intent並將這些視圖集的可見性設置爲true,將其他設置爲false。這樣用戶將不會意識到活動已重新啓動。 – Raman