`

Activity与ActivityGroup生命周期问题

阅读更多
为了查看Activity切换经历的生命周期,首先看下面代码:
布局文件
main.xml文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello"
    />
	<Button android:text="@+id/Button01" 
			android:id="@+id/Button01"
		    android:layout_width="wrap_content"
		    android:layout_height="wrap_content"></Button>
</LinearLayout>

second.xml
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    android:orientation="vertical"  
    android:layout_width="fill_parent"  
    android:layout_height="wrap_content"  
    >  
    <TextView    
        android:layout_width="fill_parent"  
        android:layout_height="fill_parent"  
        >
    </TextView>  
    <Button    
        android:id="@+id/secondButton"  
        android:layout_width="fill_parent"  
        android:layout_height="fill_parent"  
        android:text="second_button"  
        />  
</LinearLayout>  


MainActivity代码
public class MainActivity extends Activity {
   
	private Button myButton;
	
	/** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        myButton=(Button)findViewById(R.id.Button01);
        myButton.setOnClickListener(new ButtonListener());
        Log.e("","MainActivity.onCreate()");
    }
    
    @Override
    protected void onDestroy() {
    	// TODO Auto-generated method stub
    	super.onDestroy();
    	Log.e("","MainActivity.onDestroy()");
    }
    @Override
    protected void onPause() {
    	// TODO Auto-generated method stub
    	super.onPause();
    	Log.e("","MainActivity.onPause()");
    }
    @Override
    protected void onStart() {
    	// TODO Auto-generated method stub
    	super.onStart();
    	Log.e("","MainActivity.onStart()");
    }
    @Override
    protected void onStop() {
    	// TODO Auto-generated method stub
    	super.onStop();
    	Log.e("","MainActivity.onStop()");
    }
    
    @Override
    protected void onRestart() {
    	// TODO Auto-generated method stub
    	super.onRestart();
    	Log.e("","MainActivity.onRestart()");
    }
    
    @Override
    protected void onResume() {
    	// TODO Auto-generated method stub
    	super.onResume();
    	Log.e("","MainActivity.onResume()");
    }
    class ButtonListener implements OnClickListener{
    	@Override
    	public void onClick(View v) {
    		// TODO Auto-generated method stub
    		Intent intent=new Intent();
    		intent.setClass(MainActivity.this,SecondActivity.class);
    		MainActivity.this.startActivity(intent);
    		
    	}
    }
    
}




public class SecondActivity extends Activity{

	private Button secondButton;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.second);   
        secondButton = (Button)findViewById(R.id.secondButton);   
        secondButton.setOnClickListener(new ButtonListener());   
	}
	@Override
	protected void onStart() {
		// TODO Auto-generated method stub
		super.onStart();
		Log.e("","SecondActivity.onStart()");
	}
	
	@Override
	protected void onResume() {
		super.onResume();
		Log.e("","SecondActivity.onResume()");
	}
	@Override
	protected void onRestart() {
		// TODO Auto-generated method stub
		super.onRestart();
		Log.e("","SecondActivity.onReStart()");
		
	}	
	@Override
	protected void onStop() {
		// TODO Auto-generated method stub
		super.onStop();
		Log.e("","SecondActivity.onStop()");
	}
	
	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		Log.e("","SecondActivity.onDestroy()");
	}
	
	class ButtonListener implements OnClickListener{   
	        @Override  
	        public void onClick(View v) {   
	            // TODO Auto-generated method stub   
	            Intent intent = new Intent();   
	            intent.setClass(SecondActivity.this, MainActivity.class);   
	            SecondActivity.this.startActivity(intent);   
	        }   
	 }   

}


首先运行结果为:
   MainActivity.onCreate()
   MainActivity.onStart()
   MainActivity.onResume()
点击按钮之后执行为
    MainActivity.onPause()
   SecondActivity.onCreate()
   SecondActivity.onStart()
   SecondActivity.onResume()
   MainActivity.onStop()
从SecondActivity切换到Main会执行
   SecondActivity.onPause()
   MainActivity.onCreate()
   MainActivity.onStart()
   MainActivity.onResume()
   SecondActivity.onStop()
======更改一下代码 ,将SecondActivity的一部分代码增加一行SecondActivity.this.finish();

这时运行结果为:
   SecondActivity.onStop()
   SecondActivity.onDestroy()


进一步修改,将MainActivity中继承的Activity修改为ActivityGroup,执行结果为:





下面看下Activity与ActivityGroup一起使用时生命周期过程
布局文件main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
	<LinearLayout android:id="@+id/LinearLayout01" android:layout_width="wrap_content" android:layout_height="wrap_content">
		<Button android:text="@+id/Button01" 
				android:id="@+id/Button01" 
				android:layout_width="wrap_content" 
				android:layout_height="wrap_content">
		</Button>
		<Button android:text="@+id/Button02" 
				android:id="@+id/Button02" 
				android:layout_width="wrap_content" 
				android:layout_height="wrap_content">
		</Button>
	</LinearLayout>
	<LinearLayout android:id="@+id/LinearLayout02" 
				  android:layout_width="wrap_content" 
				  android:layout_height="wrap_content">
	</LinearLayout>
</LinearLayout>


listview.xml
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout android:id="@+id/LinearLayout01"     
    xmlns:android="http://schemas.android.com/apk/res/android"     
    android:layout_width="fill_parent" android:layout_height="fill_parent">     
    <ListView android:id="@+id/MyListView" android:layout_width="fill_parent"     
        android:layout_height="fill_parent">     
    </ListView>     
</LinearLayout>


MainActivity
public class MainActivity extends ActivityGroup {
    private Button btn1,btn2;
    private LinearLayout container;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        container=(LinearLayout)findViewById(R.id.LinearLayout02);
        btn1=(Button)findViewById(R.id.Button01);
        btn2=(Button)findViewById(R.id.Button02);
        btn1.setOnClickListener(new ClickEvent());
        btn2.setOnClickListener(new ClickEvent());
        Log.e("Main", "MainActivity====================>onCreate");
    }
    
    class ClickEvent implements  OnClickListener  
    {
    	@Override
    	public void onClick(View v) {
    		// TODO Auto-generated method stub
    		container.removeAllViews();
    		Intent intent=new Intent(MainActivity.this,SubActivity.class);
    		intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    		String[] str=new String[12];
    		if(v==btn1)
    		{
    			 for(int i=0;i<str.length;i++)     
                     str[i]="单选"+String.valueOf(i);     
                 intent.putExtra("Name", "subActivity1");     
                 intent.putExtra("Strings", str);     
                 intent.putExtra("ChoiceMode", ListView.CHOICE_MODE_SINGLE);//通过参数设置列
    			
    		}else if(v==btn2){
    			
    	        for(int i=0;i<str.length;i++)     
                    str[i]="复选"+String.valueOf(i);     
                intent.putExtra("Name", "subActivity2");     
                intent.putExtra("Strings", str);     
                intent.putExtra("ChoiceMode", ListView.CHOICE_MODE_MULTIPLE);//通过参数设置列表式样     

    		}
    		 Window subActivity=getLocalActivityManager().startActivity("subActivity",intent);     
             container.addView(subActivity.getDecorView());     

    		
    	}
    }

	@Override
	protected void onStart() {
		// TODO Auto-generated method stub
		super.onStart();
		Log.e("Main", "MainActivity====================>onStart");
	}
	
	@Override
	protected void onResume() {
		// TODO Auto-generated method stub
		super.onResume();
		Log.e("Main", "MainActivity====================>onResume");
	}
	
	@Override
	protected void onPause() {
		// TODO Auto-generated method stub
		super.onPause();
		Log.e("Main", "MainActivity====================>onPause");
	}
	
	@Override
	protected void onStop() {
		// TODO Auto-generated method stub
		super.onStop();
		Log.e("Main", "MainActivity====================>onStop");
	}
	
	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		Log.e("Main", "MainActivity====================>onDestroy");
	}

}


public class SubActivity extends Activity{
	private String name;  
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.listview);
		 String[] str = this.getIntent().getStringArrayExtra("Strings");     
	        int choiceMode = this.getIntent().getIntExtra("ChoiceMode",     
	                ListView.CHOICE_MODE_NONE);     
	        ListView listView = (ListView) findViewById(R.id.MyListView);     
	     
	        // 设置列表的式样     
	        int itemID = android.R.layout.simple_list_item_1;     
	        if (choiceMode == ListView.CHOICE_MODE_MULTIPLE)// 主Activity要求多选     
	            itemID = android.R.layout.simple_list_item_multiple_choice;     
	        else if (choiceMode == ListView.CHOICE_MODE_SINGLE)// 主Activity要求单选     
	            itemID = android.R.layout.simple_list_item_single_choice;     
	        ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this,     
	                itemID, str);     
	        listView.setAdapter(arrayAdapter);     
	        listView.setChoiceMode(choiceMode);     
	        Log.e(name, "SubActivity====================>onCreate");// 显示当前状态,onCreate与onDestroy对应     
	}
	
	@Override
	protected void onStart() {
		// TODO Auto-generated method stub
		super.onStart();
		Log.e(name, "SubActivity====================>onStart");
	}
	
	@Override
	protected void onResume() {
		// TODO Auto-generated method stub
		super.onResume();
		Log.e(name, "SubActivity====================>onResume");
	}
	
	@Override
	protected void onPause() {
		// TODO Auto-generated method stub
		super.onPause();
		Log.e(name, "SubActivity====================>onPause");
	}
	@Override
	protected void onStop() {
		// TODO Auto-generated method stub
		super.onStop();
		Log.e(name, "SubActivity====================>onStop");
	}
	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		Log.e(name, "SubActivity====================>onDestroy");
	}

}


运行结果如下:
MainActivity====================>onCreate
MainActivity====================>onStart
MainActivity====================>onResume
点击TAB1,执行
  SubActivity====================>onCreate
  SubActivity====================>onStart
  SubActivity====================>onResume
切换到TAB2,执行
   SubActivity====================>onPause
  SubActivity====================>onStop
  SubActivity====================>onDestroy
  SubActivity====================>onCreate
  SubActivity====================>onStart
  SubActivity====================>onResume


一个更为复杂的场景如下:
   1.一个主界面MainActivity(继承ActivityGroup) 点击“呼叫”按钮
     进入到呼叫界面 Call(继承Activity,实现SurfaceHolder.Callback接口)
   2.如果用户长时间未接电话,自动挂断并返回到MainActivity界面

进入的生命周期函数依次为
   onCreate(Main)-->onStart(Main)->onResume(Main)-->onPause(Main)-->onCreate(Call)-->onStart(Call)-->onResume(Call)-->surfaceCreated(Call)-->surfaceChanged(Call)-->onStop(Main)

没有人接听,由消息事件触发:
onPause(Call)-->onDestroy(Main)-->onCreate(Main)-->onStart(Main)->onResume(Main)---->surfaceDestroyed(Call)-->onStop(Call)-->onDestroyed(Call)
  
 


分享到:
评论

相关推荐

    用ActivityGroup解决TabHost中多个Activity跳转问题

    1. **Fragment的生命周期**:理解Fragment的生命周期与Activity的关系,以及如何在Fragment中响应Activity的生命周期变化。 2. **FragmentTransaction**:使用FragmentManager的beginTransaction方法来添加、替换或...

    ActivityGroup框架

    GroupDemo项目中的修正调用系统Activity的Bug,可能是解决了当在ActivityGroup内部调用系统Activity(如Intent.ACTION_PICK)时,导致的生命周期混乱问题。在这样的情况下,可能需要手动处理启动系统Activity的返回...

    使用ActivityGroup管理Activity

    - 生命周期管理:`ActivityGroup`管理的子Activity生命周期可能会变得复杂,容易导致内存泄漏和状态恢复问题。 - 性能:相比Fragment,`ActivityGroup`在处理复杂的UI层级和动画时,性能可能较差。 - 代码复杂性:...

    ActivityGroup实现Activit栈

    - ActivityGroup内部管理的子Activity并不直接遵循正常的Activity生命周期。当一个子Activity被添加到ActivityGroup中时,其onCreate()会被调用,但onStart()和onResume()不会被调用,直到ActivityGroup自己被启动...

    使用ActivityGroup来切换Activity和Layout

    `Fragment`提供了更灵活的界面构建和生命周期管理,而且在多屏幕适配和回退栈管理方面更为优秀。所以,如果可能的话,建议使用`Fragment`而不是`ActivityGroup`来实现类似的需求。 总结一下,`ActivityGroup`是一个...

    Android开发—使用ActivityGroup来切换Activity和Layout.pdf

    现代Android开发中,推荐使用Fragment搭配FragmentManager和FragmentTransaction来实现界面的切换和管理,这样可以更好地支持多屏幕适配,以及利用Android Studio提供的工具和生命周期管理。然而,理解ActivityGroup...

    ActivityGroup之activity内跳转和外跳转

    这通常通过自定义的启动方法实现,如`startChildActivity()`,在该方法中,你需要管理Activity的生命周期,并将新Activity的视图添加到ActivityGroup的布局中。 Activity外跳转则是指从ActivityGroup中的子Activity...

    activitygroup

    `LocalActivityManager`是`ActivityGroup`的一个重要组成部分,它负责管理子`Activity`的生命周期。 ```java public class ActivityGroup extends Activity { private LocalActivityManager mLocalActivityManager...

    ActivityGroup之Activity内跳转和外跳转

    这个过程通常需要重写`startChildActivity()`方法,以便在ActivityGroup内部管理子Activity的生命周期。例如: ```java public void startChildActivity(String tag, Intent intent) { Window window = ...

    android ActivityGroup的demo

    这两个方法与正常的Activity生命周期方法不同,它们是针对在ActivityGroup内部运行的子Activity定制的。 3. **setContentView()**:在ActivityGroup中,我们不能直接使用setContentView()方法加载布局,而是需要...

    tabhost和ActivityGroup的组合使用

    2. 自定义LocalActivityManager:在ActivityGroup中,我们需要通过getLocalActivityManager()方法获取LocalActivityManager对象,用于管理内部Activity的生命周期。 3. 添加和替换内部Activity:使用...

    gridview+activityGroup实现tab分页

    然而,从API 13开始,Android推荐使用`Fragment`和`FragmentTabHost`来替代`ActivityGroup`,因为`Fragment`提供了更好的回退栈管理、生命周期管理和资源回收能力。 实现`gridview+activityGroup`的Tab分页效果,...

    ActivityGroup

    每个子`Activity`的生命周期管理需要额外的处理,容易引发各种难以预料的问题。 2. **碎片化(Fragment)**:Android 3.0(API级别11)引入了Fragment,它提供了一种更灵活的方式来组合和管理UI组件,可以在单个`...

    ActivityGroup应用实例

    5. **生命周期管理**:ActivityGroup内的子Activity生命周期需要特别注意,因为它们的创建和销毁由LocalActivityManager控制,开发者需要确保正确处理每个子Activity的生命周期回调。 6. **异常处理和回退栈管理**...

    Android Gallery+ActivityGroup实现滑动TAB独立Activity

    4. 处理子Activity的生命周期:在ActivityGroup中,你需要监听子Activity的生命周期回调,如onStart、onResume、onPause和onStop,以便在需要时更新父Activity的状态。 然而,值得注意的是,ActivityGroup在后来的...

    ActivityGroup的实际案例

    ActivityGroup的工作原理是通过覆盖onCreateView、onDestroyView、onResumeChild、onPauseChild等方法来控制子Activity的生命周期和视图的添加与移除。其中,onCreateView方法用于创建子Activity的视图,而...

    ActivityGroupDemo

    Fragment可以在Activity的生命周期内添加、删除和替换,而且生命周期与Activity更加紧密地结合,使得管理更简单,兼容性更好。 总的来说,虽然ActivityGroup在现代Android开发中已经不再推荐使用,但它代表了...

    ActivityGroup Demo

    6. **生命周期管理**:`ActivityGroup`需要处理子Activity的生命周期事件,如创建、销毁、暂停和恢复,以确保正确管理内存和资源。这可能涉及到重写`onCreate()`, `onStart()`, `onResume()`, `onPause()`, `onStop...

Global site tag (gtag.js) - Google Analytics