标签:
其实之前自己已经学习过,但是有些东西多少也忘记了,还是得再重新复习一下,再去找资料和网上搜索来加深自己的记忆;
Activity的一些基本信息
Activity通常是单独的屏幕,显示控件,用于用户操作,并对用户的操作事件进行响应处理;
Actvity之间通过Intent进行通信;Intent中,对于动作以及动作的数据是比较关键的,当然,我们也可以直接指定要启动的Activity;
Intent intent = new Intent();
intent.setClass(this, SomeOtherActivity.class);
startActivity(intent);
每个Activity,都需要在 AndroidManifest.xml中进行描述,否则无法启动;
例如工程默认启动的Activity
<activity
android:name=".MainActivity"
android:alwaysRetainTaskState="true"
android:label="@string/app_name"
android:uiOptions="splitActionBarWhenNarrow" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
需要指定名称为对应的Activity类名;由于是启动的Actvity,所以需要指定action为Main,category为LAUNCHER,这样才能在启动的时候经过 intent-filter的过滤,找到这个activity来启动;
其他的activity也需要进行描述;
<activity
android:name=".ContactDetailActivity"
android:label="@string/title_activity_contact_detail" >
<!-- android:theme="@android:style/Theme.Black" -->
</activity>
当然,如果我们需要让我们的activity来处理其他action时候,我们就需要指定 action,同时接收的时候,处理action对应的数据;
这个时候,我们需要从调用 startActivity的地方,准备好要传给对应activity的数据;
简单的传递数据
intent.putExtra("key","value");
在接受的activity中;
Intent intent = this.getIntent();
String flagValue = intent.getStringExtra("flag");
我们也可以通过Intent.getExtras();返回一个Bundle对象,可以从这个对象里获取对应的值;
例如我们通过 startActivityForResult方式启动另外一个Activity,然后得到那个Activity返回的数据,例如我们需要打开一个Activity来收集用户信息,用户点击提交的时候,我们需要得到用户数据,这个时候
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
switch (resultCode)
{
//结果返回
case RESULT_OK:
//获取Bundle的数据
Bundle bl= data.getExtras();
String sex=bl.getString("sex");
if (sex.equals("M"))
{
rbMan.setChecked(true);
}
else
{
rbWoman.setChecked(true);
}
body_height=bl.getDouble("height");
editHight.setText(""+body_height);
break;
default:
break;
}
}
通过Intent.getExtras获得Bundle之后,再去取里面的数据,其实和直接从Intent获取数据类似;
我们启动的时候,需要通过startActivityForResult来启动:
//通过intent跳转到下一个页面.
Intent intent = new Intent();
intent.setClass(ActivityBundle.this, ResultActivity.class);
//跳到下一个Activity,并且等待其返回结果
startActivityForResult(intent, 0);
此时,另外一个Activity在收集完数据返回的地方,需要设置结果:
//将intent传会上一个Activity
Intent intent = new Intent();
//通过Bundle来获取数据,通过key-Value的方式放入数据
Bundle bl = new Bundle();
bl.putDouble("height", body_height);
bl.putString("sex", sex);
//将Bundle放入Intent传入下一个Activity
intent.putExtras(bl);
ResultActivity.this.setResult(RESULT_OK, intent);
ResultActivity.this.finish();
有的时候,我们的基础数据类型,可能传递不了特定类型的数据(最大只能40K),或者数据太大(例如文件什么的),不方便直接通过intent的Bundle传递的时候,我们可以传递一个uri给到另外的Activity进行处理;
例如我们打开网页的时候;
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
依此类推,我们还有其他的常用ACTION
Intent.ACTION_DIAL 打开拨号界面
Intent.ACTION_CALL 直接拨打电话
Intent.ACTION_DELETE 卸载应用
Intent.ACTION_SENDTO 打开邮件发送界面
Intent.ACTION_SEND 直接发送邮件
。。。
当然这种方式只是特定的action以及action对应数据uri的一种方式;
我们也可以bundle来传递uri的字符串表示,然后在处理的activity使用
Uri uri = Uri.parse(intent.getStringExtra("uri"));
这样的方式来传递;
还有可以使用 Intent.EXTRA_STREAM 来传递uri ;
intent.putExtra(Intent.EXTRA_STREAM, uri);
关于Activity的生命周期
这个图片也是最基本的Activity生命周期的状态图;
Activity有三种状态:
1、运行,即用户正在操作或者该活动在最顶部;
2、暂停,有别的活动在上方,但是对于用户仍然可见;
3、停止,活动被完全覆盖,不可见;
三种状态中,后两种状态在系统需要内存的时候会被清理;用户回到该活动时候需要重新onCreate;
活动完整生命周期和可视生命周期分别为onCreate到onDestroy和onStart到onStop;前台生命周期为onResume到onPause;
根据我们的需要,重载这些函数来定制我们需要的处理流程;
一般来说,我们对于完整生命周期需要的,初始化和摧毁放着完整生命周期两个函数,对于与界面相关的,放在可视生命周期函数,而前台生命周期的处理要轻量级;
onPause是三个结束周期函数中,唯一一个必然调用的,所以一些持久化之类的需要在里面处理;
onSaveInstanceState()和onRestoreInstanceState()可以在活动被系统强制清理时保存状态并在用户回到活动时候调用,所以可以用于保存一些临时状态,并在返回时候恢复这些状态;
关于Activity的学习
标签:
原文地址:http://www.cnblogs.com/coldforce/p/4973208.html