2014-02-13 2 views
3

Я заметил это: у меня есть родительская активность A, которая открывает дочернюю активность B с startActivity(intent). В действии B, если я буду finish(), это действие каким-либо образом родительская активность будет загружена снова из начального состояния, но если я нажму кнопку обратной клавиатуры, я вернусь к активности A, как в состоянии, в котором я ее оставил.Кнопка возврата дочерней активности vs finish()

Вот пример того, как я заканчиваю деятельности B:

@Override 
public boolean onOptionsItemSelected(MenuItem item) 
{ 
    switch (item.getItemId()) 
    { 
    case android.R.id.icon: 
     finish(); 
     return true; 
    default: 
     return super.onOptionsItemSelected(item); 
    } 
} 

Вот как я открываю активность B от активности A:

Intent intent = new Intent(thisActivity, toActivity); 
startActivity(intent); 

А вот Manifest XML:

<activity 
    android:name="com.evapp.activities.A" 
    android:label="@string/A" > 
</activity> 
<activity 
    android:name="com.evapp.activities.B" 
    android:configChanges="orientation" 
    android:label="@string/B" 
    android:parentActivityName="com.evapp.activities.A" 
    android:screenOrientation="portrait" > 

    <!-- Parent activity meta-data to support 4.0 and lower --> 
    <meta-data 
     android:name="android.support.PARENT_ACTIVITY" 
     android:value="com.evapp.activities.A" /> 
</activity> 

Может кто-нибудь объяснить мне почтение между finish() и вернуться?

+0

Вы переопределяете 'onBackPressed'? –

+0

nope ............ – vlio20

+0

Он должен иметь тот же эффект в идеале. Можете ли вы показать, где вы его завершаете, и соответствующий связанный код? –

ответ

1

Вызов finish() и нажав на кнопку назад не совсем то же самое, когда вы используете фрагменты.Если мы проверим исходный код Android Activity, мы увидим, что он не просто вызывает finish(), но называет это FragmentManagerspopBackStackImmediate() до этого.

/** 
* Called when the activity has detected the user's press of the back 
* key. The default implementation simply finishes the current activity, 
* but you can override this to do whatever you want. 
*/ 
public void onBackPressed() { 
    if (!mFragments.popBackStackImmediate()) { 
     finish(); 
    } 
} 

Что popBackState() делает это удаляет последний фрагмент из задней стеки. Immediate просто означает, что он делает это немедленно, а не асинхронно. Он возвращает false только тогда, когда фрагмент не был удален - в этом случае будет вызываться finish().

Я не уверен, почему ваше первое действие, похоже, повторно инициализируется при вызове finish(). В случае, когда вы действительно вернетесь к своей первой активности, должен быть выполнен метод onResume(), который может изменить его внешний вид. Чтобы полностью понять, что происходит, мы должны увидеть, как вы создаете свои фрагменты и что происходит в методе onResume().

+0

Я не использую (пока)' onResume', но я добавлю код, который открывает действие B. – vlio20

1

Нажатие кнопки «Назад» и «Вызов завершения»() должны иметь точно такое же поведение, если вы не переопределяете onBackPressed.

Когда активность B начинается с деятельностью A, следующие события имеют место:

  • активность А будет приостановлены (но не уничтожен, пока достаточные ресурсы)
  • активности B будет создан и возобновил

При вызове Finish() или нажав на кнопку назад от активности в следующие мероприятия пройдут:

  • активность B будет приостановлена ​​
  • активность А будет возобновлена ​​
  • активность B будет уничтожен

активность А не создан снова, но возобновилась. (если только он не был уничтожен из-за выпуска ресурсов).

Вы можете проверить то же самое со следующим примером приложения.

MainActivity.java

package com.example.activitytest; 
public class MainActivity extends Activity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Toast.makeText(getApplicationContext(), "MainActivity created", Toast.LENGTH_SHORT).show(); 
    Button launchChild = (Button) findViewById(R.id.btnLaunchChild); 
    launchChild.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
       Intent myIntent = new Intent(getBaseContext(), ChildActivity.class); 
       //myIntent.putExtra("key", value); //Optional parameters 
       startActivity(myIntent); 
     } 
    }); 
} 

@Override 
protected void onResume(){ 
    super.onResume(); 
    Toast.makeText(getApplicationContext(), "MainActivity resumed", Toast.LENGTH_SHORT).show(); 

} 

@Override 
protected void onPause(){ 
    super.onPause(); 
    Toast.makeText(getApplicationContext(), "MainActivity paused", Toast.LENGTH_SHORT).show(); 

} 

@Override 
protected void onDestroy(){ 
    super.onPause(); 
    Toast.makeText(getApplicationContext(), "MainActivity destroyed", Toast.LENGTH_SHORT).show(); 

} 
} 

ChildActivity.java

package com.example.activitytest; 

public class ChildActivity extends Activity { 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_child); 

    Toast.makeText(getApplicationContext(), "Child created", Toast.LENGTH_SHORT).show(); 
    Button finish = (Button) findViewById(R.id.btnFinish); 
    finish.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      finish(); 
     } 
    }); 
} 

@Override 
protected void onResume(){ 
    super.onResume(); 
    Toast.makeText(getApplicationContext(), "Child resumed", Toast.LENGTH_SHORT).show(); 

} 

@Override 
protected void onPause(){ 
    super.onPause(); 
    Toast.makeText(getApplicationContext(), "Child paused", Toast.LENGTH_SHORT).show(); 

} 

@Override 
protected void onDestroy(){ 
    super.onPause(); 
    Toast.makeText(getApplicationContext(), "Child destroyed", Toast.LENGTH_SHORT).show(); 

} 
} 

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:paddingBottom="@dimen/activity_vertical_margin" 
android:paddingLeft="@dimen/activity_horizontal_margin" 
android:paddingRight="@dimen/activity_horizontal_margin" 
android:paddingTop="@dimen/activity_vertical_margin" 
tools:context=".MainActivity" > 

<Button 
    android:id="@+id/btnLaunchChild" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerHorizontal="true" 
    android:layout_centerVertical="true" 
    android:text="@string/launch_child" /> 

</RelativeLayout> 

activity_child.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

<Button 
    android:id="@+id/btnFinish" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerHorizontal="true" 
    android:layout_centerVertical="true" 
    android:text="@string/finish" /> 

</RelativeLayout> 

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
package="com.example.activitytest" 
android:versionCode="1" 
android:versionName="1.0" > 

<uses-sdk 
    android:minSdkVersion="9" 
    android:targetSdkVersion="19" /> 

<application 
    android:allowBackup="true" 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/AppTheme" > 
    <activity 
     android:name="com.example.activitytest.MainActivity" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <activity 
     android:name="com.example.activitytest.ChildActivity"> 
    </activity> 
</application> 

</manifest> 
Смежные вопросы