2016-08-04 4 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 будет возобновить активность.

LifeCycle будет

-onclick

-onPause

-onNewIntent

-onResume

+0

Но я хочу, чтобы вызов был вызван, вся суть вопроса заключалась в том, чтобы обрабатывать изменения предпочтений (которые сильно меняют весь пользовательский интерфейс), я делаю материал UI в oncreate, поэтому мне нужно, чтобы он был вызван – fuadj

+0

, один из способов - создать все представления в onCreate и setvisibility ложны для набора пользовательского интерфейса, необходимого после перезапуска, и как только вы включаетесь onNewIntent, используйте намерение и установите видимость этого набора представлений true, а другой установите false. Таким образом, пользователь не будет знать, что активность была перезапущена. – Raman