Android中Activity总结
来源:互联网 发布:c语言 坏值 编辑:程序博客网 时间:2024/05/19 11:47
昨天总结了Intent,今天来认真搞一下Activity……
简单来说,Activity就是一个一个的窗口界面,一个应用程序通常由多个联系松散的Activity组成,一般指定应用中的一个Activity为主Activity,即首次启动应用时用户看到的界面,每个Activity均可启动另一个Activity,而前一个Activity会停止,系统会在返回栈中保留该Activity,当用户完成当前Activity并返回时,系统会从堆栈中将其弹出并销毁,恢复前一个Activity。
Activity生命周期:
单个Activity:
onCreate()->onStart()->onResume()->onPause()->onStop()->onDestroy()
前三个是显示状态,中间两个是隐藏状态,最后一个是销毁状态
多个Activity:
MainActivity onCreate()->MainActivity onStart()->MainActivity onResume()->MainActivity onPause()->
SecondActivity onCreate()->SecondActivity onStart()->SecondActivity onResume()->MainActivity onStop()->
SecondActivity onPause()->MainActivity onRestart()->MainActivity onStart()->MainActivity onResume()->SecondActivity onStop()->SecondActivity onDestroy()
横竖屏切换:
MainActivity onCreate()->MainActivity onStart()->MainActivity onResume()->MainActivity onPause()->MainActivity onSaveInstanceState()->MainActivity onStop()->MainActivity onDestroy()->MainActivity onCreate()->MainActivity onStart()->MainActivity onResume()
注:在使用onDestroy()时,应使用release()释放资源
实现生命周期的回调:
可以在Activity状态发生变化时重写方法,以下框架Activity包括每一个基本生命周期方法
public class ExampleActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 活动被创建 } @Override protected void onStart() { super.onStart(); // 活动将要成为可见的 } @Override protected void onResume() { super.onResume(); // 活动可见 } @Override protected void onPause() { super.onPause(); // 另一个活动获得焦点,当前活动失去焦点 } @Override protected void onStop() { super.onStop(); // 活动不再是可见的 } @Override protected void onDestroy() { super.onDestroy(); // 活动将被销毁 }}
启动Activity方式:
显示启动:
Intent intent = new Intent(MainActivity.this, SecondActivity.class);startActivity(intent);或者:
Intent intent = new Intent();ComponentName con = new ComponentName(MainActivity.this, SecondActivity.class);intent.setComponent(con);startActivity(intent);
隐式启动:
在Manifest文件中添加Intent过滤器:
<activity android:name=".SecondActivity"> <intent-filter> <action android:name = "startSecond"/> <category android:name="android.intent.category.DEFAULT/> </intent-filter></activity>
之后即可在java文件中隐式启动Activity:
Intent intent = new Intent();intent.setAction("startSecond");startActivity(intent);隐式还用于启动系统应用
启动系统浏览器:
intent.setAction(Intent.ACTION_VIEW);Uri uri = Uri.parse("www.doveminr.com");intent.setData(uri);startActivity(intent);启动相册:
Intent intent = new Intent();intent.setAction(Intent.ACTION_GET_CONTENT);intent.setType("image/*");startActivity(intent);发送短信:
Intent intent = new Intent();intent.setAction(Intent.ACITON_SEND);intent.setType("text/plain");intent.putExtra(Intent.EXTRA_TEXT, "This is a text");startActivity(intent);启动电话:
Intent intent = new Intent();intent.setAction(Intent.ACTION_VIEW);Uri uri = Uri.parse(tel:1234567);intent.setData(uri);startActivity(intent);
1. intent.putExtra("name", "David");
2. Bundle bundle = new Bundle();
bundle.putString("name", "David");
intent.putExtras(bundle);
3. bundle.putSerializable("person", person); //person为一个自己定义的类,传递多个数据
intent.putExtras(bundle);
4.Bitmap bitmap = BitmapFactory.decodeResource(getResource(), R.drawable.ic_launcher);
bundle.putParcelable("bitmap", bitmap);
intent.putExtras(bundle);
注意:Bundle或Bitmap传递数据有大小限制,一般应小于512kb,
启动Activity以获得结果:
通过调用startActivityForResult()启动Activity,在随后收到后续Activity的结果,则实现onActivityResult()回调方法,当后续Activity完成时,会使用Intent向onActivityResult()方法返回结果。例如,您可呢希望用户选取其中一位联系人,以便您的Activity对该联系人中的信息执行某项操作,可以通过一下代码创建此类Intent并处理结果:
private void pickContact() { // 创建一个intent去挑选一个联系人,作为内容提供者的Uri Intent intent = new Intent(Intent.ACTION_PICK, Contacts.CONTENT_URI); startActivityForResult(intent, PICK_CONTACT_REQUEST);}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) { // 如果请求被允许,并且请求是PICK_CONTACT_REQUEST if (resultCode == Activity.RESULT_OK && requestCode == PICK_CONTACT_REQUEST) { // 提交一个请求到联系人的内容提供者作为联系人的姓名
Cursor cursor = getContentResolver().query(data.getData(), new String[] {Contacts.DISPLAY_NAME}, null, null, null); if (cursor.moveToFirst()) { // 如果光标非空 int columnIndex = cursor.getColumnIndex(Contacts.DISPLAY_NAME); String name = cursor.getString(columnIndex); // 与选中联系人有关的操作 } }}ContentResolver对一个内容提供程序执行查询,后者返回一个Cursor,让查询的数据能够被读取。
保存Activity状态:
当Activity暂停或停止时,Activity状态会得到保留,当Activity暂停或停止时,Activity对象仍保留在内存中,有关其成员和当前状态的所有信息仍处于活动状态,因此,用户在Activity内所做的任何更改都会得到保留,当Activity返回前台时,这些更改仍然存在。然而,当系统为了恢复内存而销毁某项Activity时,Activity对象也会被销毁,故系统在继续Activity时无法保持状态,而是必须用户返回Activityi时重建Activity对象,这种情况下,可以实现另一个回调方法对有关Activity状态的信息进行保存,以确保有关Activity状态的重要信息得以保留:onSaveInstanceState()。系统会先调用onSaveInstanceState(),然后再使Activity变得易于销毁,系统会向该方法传一个bundle,可以使用putString()和putInt()等方法以名称-值对形式保存有关Activity状态的信息。然后,如果系统终止应用进程,且用户返回Activity,系统会重建Activity并将Bundle同时传递给onCreate()和onRestoreInstanceState()。可以使用上述方法从bundle提取保存的状态并恢复该Activity状态。若没有状态信息需要恢复,则传递给Bundle的是空值。
不过,即使您什么都不做,也不实现onSaveInstanceState(),Activity类的onSaveInstanceState()默认实现也会恢复部分 Activity 状态。具体地讲,默认实现会为布局中的每个 View调用相应的onSaveInstanceState()方法,让每个视图都能提供有关自身的应保存信息。Android 框架中几乎每个小部件都会根据需要实现此方法,以便在重建 Activity 时自动保存和恢复对 UI 所做的任何可见更改。例如,EditText小部件保存用户输入的任何文本,CheckBox()小部件保存复选框的选中或未选中状态。您只需为想要保存其状态的每个小部件提供一个唯一的 ID(通过 android:id属性)。如果小部件没有 ID,则系统无法保存其状态。
尽管 onSaveInstanceState()的默认实现会保存有关您的Activity UI 的有用信息,您可能仍需替换它以保存更多信息。例如,您可能需要保存在 Activity 生命周期内发生了变化的成员值(它们可能与 UI 中恢复的值有关联,但默认情况下系统不会恢复储存这些 UI 值的成员)。由于onSaveInstanceState()的默认实现有助于保存 UI 的状态,因此如果您为了保存更多状态信息而替换该方法,应始终先调用onSaveInstanceState())的超类实现,然后再执行任何操作。 同样,如果您替换 onRestoreInstanceState()方法,也应调用它的超类实现,以便默认实现能够恢复视图状态。
处理配置变更
有些设备配置可能会在运行时发生变化(例如屏幕方向、键盘可用性及语言)。 发生此类变化时,Android 会重建运行中的 Activity(系统调用onDestroy(),然后立即调用onCreate())。此行为旨在通过利用您提供的备用资源(例如适用于不同屏幕方向和屏幕尺寸的不同布局)自动重新加载您的应用来帮助它适应新配置。处理此类重启的最佳方法是利用onSaveInstanceState()和onRestoreInstanceState()(或onCreate())保存并恢复 Activity 的状态
- Android中Activity总结
- Android中Activity生命周期学习总结。
- Android Activity 中 Intent 的使用总结
- Android Activity生命周期总结
- Android Activity总结
- Android Activity总结
- Android Activity总结
- Android基础:总结Activity
- android--activity总结
- Android Activity总结
- Android之activity总结
- Android之activity总结
- android的activity总结
- Android之activity总结
- Android Activity回穿值总结
- Android Activity总结
- Android Activity 总结
- Android之activity总结
- 史上最经典的Linux内核学习方法论
- EDA软件_Cadence_Allegro 16.6导入网络表出错分析
- 迷宫问题
- 单例模式
- java快速读写文件和组装字符串
- Android中Activity总结
- 判断当前客户端是否移动设备
- 欢迎使用CSDN-markdown编辑器
- 先在这里立一个flag吧
- 关于for循环迭代一个小问题
- linux select() FD_ZERO/FD_SET/FD_CLRFD_ISSET详解
- Glide图片加载使用心得
- 贝塞尔曲线实现QQ未读消息气泡拖拽效果
- 关于STM8的程序下载问题:SWIM Error[30006]报错解决办法汇总