2016-08-04 32 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