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


Activity间传递数据:
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 的状态






1 0
原创粉丝点击