- 浏览: 233871 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (102)
- 开源软件 (1)
- 并发 (14)
- WEB (1)
- NIO (4)
- Socket (5)
- 应用服务器 (4)
- 集群 (0)
- 数据库 (1)
- JAVA基础 (17)
- 开源框架 (2)
- 业务知识 (1)
- JVM (9)
- Windows (1)
- LINUX (0)
- Jquery (0)
- JMS (0)
- Cache (0)
- Oracle (5)
- XML (0)
- EJB (0)
- WebService (0)
- Struts2 (1)
- Hibernate (1)
- Spring (0)
- 设计模式 (4)
- UML (0)
- JS (12)
- 网络爬虫 (0)
- 数据结构与算法 (1)
- EXT (1)
- DIV+CSS (2)
- 安全 (3)
- Android (9)
- LDAP (1)
- Mybatis (1)
最新评论
-
Dom_4j:
...
理解注解中的@Inherited -
s469799470:
demo少个ID
iframe父子页面交互问题 -
errorerror0:
...
iframe父子页面交互问题 -
errorerror0:
iframe父子页面交互问题 -
johnawm:
2012-12-18 wangshibei 写道CountD ...
CountDownLatch的使用
为了查看Activity切换经历的生命周期,首先看下面代码:
布局文件
main.xml文件
second.xml
MainActivity代码
首先运行结果为:
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
listview.xml
MainActivity
运行结果如下:
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)
布局文件
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)
发表评论
-
让Activity后台运行
2012-02-27 09:50 0http://fonter.iteye.com/blog/68 ... -
Service
2012-02-21 20:04 1495public class MainActivity exten ... -
SurfaceView的使用总结
2012-02-18 16:12 0参考以下网址: http://enefry.iteye.com ... -
Android学习
2012-02-18 16:00 0http://kb.cnblogs.com/a/2325724 ... -
LayoutInflater的使用
2012-02-06 16:25 1596实际开发种LayoutInflater这个类还是非常有用 ... -
通过一个android中的handler处理场景想到的
2012-02-03 11:03 2479本程序主要功能步骤如下: 1.利用Timer 编写一个倒 ... -
关于Service的使用
2012-01-18 14:06 1060Service是android 系统中的一种组件,它跟Acti ... -
关于Gallery使用
2012-01-15 22:53 1513Grally是可以水平滚动列表元素的布局,一般用来滚动图片。 ... -
Android的动态布局
2012-01-11 19:05 755http://ziyu-1.iteye.com/blog/99 ... -
LayoutInflater的inflate函数用法
2012-01-09 11:35 1719Android里面想要创建一个画面的时候, 初学一般都是新建一 ... -
Android Dialog知识
2012-01-09 11:07 1190Andriod中实现对话框可以使用AlertDialog.Bu ...
相关推荐
1. **Fragment的生命周期**:理解Fragment的生命周期与Activity的关系,以及如何在Fragment中响应Activity的生命周期变化。 2. **FragmentTransaction**:使用FragmentManager的beginTransaction方法来添加、替换或...
GroupDemo项目中的修正调用系统Activity的Bug,可能是解决了当在ActivityGroup内部调用系统Activity(如Intent.ACTION_PICK)时,导致的生命周期混乱问题。在这样的情况下,可能需要手动处理启动系统Activity的返回...
- 生命周期管理:`ActivityGroup`管理的子Activity生命周期可能会变得复杂,容易导致内存泄漏和状态恢复问题。 - 性能:相比Fragment,`ActivityGroup`在处理复杂的UI层级和动画时,性能可能较差。 - 代码复杂性:...
- ActivityGroup内部管理的子Activity并不直接遵循正常的Activity生命周期。当一个子Activity被添加到ActivityGroup中时,其onCreate()会被调用,但onStart()和onResume()不会被调用,直到ActivityGroup自己被启动...
`Fragment`提供了更灵活的界面构建和生命周期管理,而且在多屏幕适配和回退栈管理方面更为优秀。所以,如果可能的话,建议使用`Fragment`而不是`ActivityGroup`来实现类似的需求。 总结一下,`ActivityGroup`是一个...
现代Android开发中,推荐使用Fragment搭配FragmentManager和FragmentTransaction来实现界面的切换和管理,这样可以更好地支持多屏幕适配,以及利用Android Studio提供的工具和生命周期管理。然而,理解ActivityGroup...
这通常通过自定义的启动方法实现,如`startChildActivity()`,在该方法中,你需要管理Activity的生命周期,并将新Activity的视图添加到ActivityGroup的布局中。 Activity外跳转则是指从ActivityGroup中的子Activity...
`LocalActivityManager`是`ActivityGroup`的一个重要组成部分,它负责管理子`Activity`的生命周期。 ```java public class ActivityGroup extends Activity { private LocalActivityManager mLocalActivityManager...
这个过程通常需要重写`startChildActivity()`方法,以便在ActivityGroup内部管理子Activity的生命周期。例如: ```java public void startChildActivity(String tag, Intent intent) { Window window = ...
这两个方法与正常的Activity生命周期方法不同,它们是针对在ActivityGroup内部运行的子Activity定制的。 3. **setContentView()**:在ActivityGroup中,我们不能直接使用setContentView()方法加载布局,而是需要...
2. 自定义LocalActivityManager:在ActivityGroup中,我们需要通过getLocalActivityManager()方法获取LocalActivityManager对象,用于管理内部Activity的生命周期。 3. 添加和替换内部Activity:使用...
然而,从API 13开始,Android推荐使用`Fragment`和`FragmentTabHost`来替代`ActivityGroup`,因为`Fragment`提供了更好的回退栈管理、生命周期管理和资源回收能力。 实现`gridview+activityGroup`的Tab分页效果,...
每个子`Activity`的生命周期管理需要额外的处理,容易引发各种难以预料的问题。 2. **碎片化(Fragment)**:Android 3.0(API级别11)引入了Fragment,它提供了一种更灵活的方式来组合和管理UI组件,可以在单个`...
5. **生命周期管理**:ActivityGroup内的子Activity生命周期需要特别注意,因为它们的创建和销毁由LocalActivityManager控制,开发者需要确保正确处理每个子Activity的生命周期回调。 6. **异常处理和回退栈管理**...
4. 处理子Activity的生命周期:在ActivityGroup中,你需要监听子Activity的生命周期回调,如onStart、onResume、onPause和onStop,以便在需要时更新父Activity的状态。 然而,值得注意的是,ActivityGroup在后来的...
ActivityGroup的工作原理是通过覆盖onCreateView、onDestroyView、onResumeChild、onPauseChild等方法来控制子Activity的生命周期和视图的添加与移除。其中,onCreateView方法用于创建子Activity的视图,而...
Fragment可以在Activity的生命周期内添加、删除和替换,而且生命周期与Activity更加紧密地结合,使得管理更简单,兼容性更好。 总的来说,虽然ActivityGroup在现代Android开发中已经不再推荐使用,但它代表了...
6. **生命周期管理**:`ActivityGroup`需要处理子Activity的生命周期事件,如创建、销毁、暂停和恢复,以确保正确管理内存和资源。这可能涉及到重写`onCreate()`, `onStart()`, `onResume()`, `onPause()`, `onStop...