2016-08-04 3 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 (의도 의도) 메소드를 처리 할 수 ​​있습니다. 이렇게하면 활동을 다시 시작하고 의도를 보내고,이 활동은 죽지 않고 활동의 생성은 호출되지 않습니다.


<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> 
AndroidManifest.xml에

에서

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"); 
    } 
} 

온 클릭은 활동을 다시 시작합니다.

라이프 사이클 될 것

-onclick

-onPause

-onNewIntent

-onResume

+0

그러나 나는 oncreate를 호출하기를 원한다. 질문의 요점은 (전체 UI를 상당히 바꾼) 환경 설정 변경을 처리하는 것이었고, 나는 UI 작성을 할 수 있으므로 호출해야한다. – fuadj

+0

한 가지 방법은 모두를 만드는 것이다. onCreate 및 setvisibility의 뷰가 재시작 후 필요한 UI 세트에 대해 false로 설정되고 onNewIntent에 도달하면 인 텐트를 사용하고 이러한 뷰 세트의 가시성을 true로 설정하고 다른 세트는 false로 설정합니다. 이렇게하면 사용자는 활동이 다시 시작되었음을 알 수 없습니다. – Raman

관련 문제