Activity简单认识
附言
首先,刚刚接触Android不到两周,平时工作又太忙,也没有时间去花较多的时间去学习,只能通过网上的一些博客,网上的别人写的一些东西,来学习。之前一直很想学,真的。可是大二时(也就是两年前),在我的电脑上折腾Android,可是那时,折腾完之后,发现太卡了,后来就不了了之了。这次接触Android也很偶然,因为公司的一些扯淡的培训,啥都不懂得 时候,让我们写些简单地App,于是就边学边做,真正学习的时候不超过4天。所以,在我写的这些里面,可能存在着很多的认识不足,欢迎指正。
1 Activity是什么?
Activity,中文意思是活动,它是Android应用程序的重要组成单元之一,提供了和用户交互的可视化界面。但是Activity本身是没有界面的,本质上它只是一个接口,给用户提供一个交互式的接口功能,我们必须向Activity中添加组件,由我们添加的组件来实现具体的功能。在开发时,通过setContentView(View)来把UI放到Activity中。Activity是单独的,用于处理用户操作,几乎所有的Activity都和用户打交道。(初步认识,后续学习到新的高级的功能时,再补充)。
2 Activity的生命周期
2.1Activity四个重要状态
状态 | 描述 |
---|---|
活动状态 | 当前的Activity,位于Activity栈顶,用户可见,并且可以获得焦点 |
暂停状态 | 失去焦点的Activity,仍然可见,但是在内存低的情况下,不能被内存killed |
停止状态 | 该Activity被其他Activity所覆盖,不可见,但是它仍然保存所有的状态和信息。当内存低(实在不够用)的情况下,它将要被系统killed |
销毁状态 | 该Activity结束,或者Activity所在的Dalvik进程结束 |
既然有了四种状态,当然得有些方法来控制这些状态之间的切换———onCreate()、onStart()、onResume()、onPause()、onStop()、onDestory()、onRestart(),也是由这些方法来控制或者说体现Activity的生命周期。
2.2 Activity生命周期描述
说到Activity的生命周期,不得不贴上官方的一张图,通过这幅图,我们可以很清楚的知道Activity的一个生命周期,知道Activity的工作流程。
- onCreate():在创建Activity时被回调,该方法是最常见的方法,用来来实现对Activity的初始化等。
- onStart():启动Activity时被回调,也就是当一个Activity变为显示时被回调。
- onRestart():重新启动Activity时被回调,该方法总是在onStart()方法以后执行。
- onPause():暂停Activity时被回调,该方法需要被非常快速地执行,因为直到该方法执行完毕后,下一个Activity才能被恢复。在该方法中,通常用于持久保存数据。比如说,我们正在用手机全屏看着视频,突然一个意外来电,这时,就需要迅速地pause你的视频应用,等到再次回到你之前的视频app中时,可以继续之前的进度继续观看。
- onResume():当Activity由暂停状态恢复为活动状态时调用。调用该方法后,该Activity位于Activity栈的栈顶。该方法总是在onPause()方法以后执行。
- onStop():停止Activity时被回调。
- onDestory():销毁Activity时被回调。
注:在Activity中,可以根据需要重写上述方法,通常我们经常重写的是onCreate()和onPause(),因为最常用。
3 创建、配置、启动和关闭Activity
3.1 创建Activity
创建一个Activity,大致可以分为两步,如下:
* 创建一个Activity,一般是继承android.app包种的Activity类,但是在不同的应用场景中,也可以继承Activity子类,比如ListActivity,TabActivity(TabActivity已经被放弃了,最好还是不要用了,昨晚熬夜写的播放器用了TabHost,然后写着写着就醉了….别人和我写同样地效果甚至更好的效果,用fragment又好看,又没遇到我的问题,所以用Tab的人请三思….ps:不过也不一定,我初学Android还没有几天,为了赶一个app而不得搜一些博客中的方法来实现我的功能,不过一般的技术博都不会写这么基础的问题,所以并没有找到太多,可能是我使用不当,导致出现了问题)。好了废话不多说,继续之前的Activity创建问题。
import android.app.Activity;
public class MainActivity extends Activity{
// code...
}
- 重写需要的回调方法。通常情况下,都需要重写onCreate()方法,并且在该方法中调用setContentView(View v)方法设置需要显示的UI组件。
@override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);//activity_main是xml布局文件
}
3.2 配置Activity
创建Activity后,需要在AndroidMainfest.xml文件中进行配置,如果没有配置,而又在程序中启动了该Activity,则会抛异常。
具体的配置方法是在标记中添加标记。格式如下:
<activity
android:icon="@drawable/icon_name"
android:name=".ClassName"
android:label="@string/description"
android:theme="apple theme"
...
>
</activity>
Android:name 也可以使用绝对路径
3.3 启动和关闭Activity
3.3.1 启动Activity
在一个Android项目中,如果只有一个Activity,那么只需要在AndroidManifest.xml文件中对其进行配置,并且将其设置为程序的入口。这样当运行该项目时,将自动启动该Activity。否则,需要应用startActivity()方法来启动需要的Activity。
public void startActivity(Intent intent){}
参数Intent是Android应用里各组件之间的通信方式,一个Activity通过Intent来表达自己的意图、创建Intent对象时,需要制定想要启动的Activity。
比如启动一个名称为LocalMusicActivity的Activity:
Intent intent = new Intent(MainActivity.this,LocalMusicActivity.class);
startActivity(intent);
3.3.2 关闭Activity
想要关闭一个Activity,可以使用Activity提供的finish()方法
public void finish()
比如,点击退出按钮,退出当前的Activity:
Button btnExit = (Button)findViewById(R.id.btnExit);
btnExit.setOnClickListener(new OnClickListener(){
@override
public void onClick(View v){
finish();//关闭当前的Activity
}
});
说明:如果当前的Activity不是主活动,则执行finish()之后,回到调用它的那个Activity;否则,将返回到主屏幕。
4 多个Activity的使用
很明显,一个App应用,一般来说,不可能只有一个页面,当使用多个Activity的时候,当在Activity之间进行跳转的时候,可能需要传递一些数据。我们使用Bundle来实现这些数据的交换。
4.1 使用Bundle在Activity之间交换数据
当在一个Activity中启动另一个Activity时,经常需要传递些数据。这时就可以通过Intent来实现。Intent通常被称为两个Activity之间的信使,通过将要传递的数据保存在Intent中,就可以实现Activity之间的数据传递了。
在Android中,可以将要保存的数据放在Bundle对象中,然后通过Intent提供的putExtras()方法将要携带的数据保存到Intent中。
For example:
Intent intent = new Intent(MainActivity.this,HelloActivity.class);//从MainActivity跳转到HelloActivity
Bundle bundle = new Bundle();
bundle.putCharSequence("message1",message1);
bundle.putCharSequence("message2",message2);
...
intent.putExtras(bundle);
startActivity(intent);
在HelloActivity.java中:
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_hello);
Intent intent = getIntent();//获取Intent对象
Bundle bundle = intent.getExtras();
TextView message1 = (TextView)findViewById(R.id.message1);
...
message.setText("Message1:"+bundle.getString("message1"));
...
}
4.2 调用另一个Activity并返回结果
在Android App开发中,有时需要在一个Activity中调用另外一个Activity,当用户在第二个Activity中操作完成后,程序自动返回到第一个Activity中,第一个Activity必须能够获取并显示用户在第二个Activity中选择的结果;或者,在第一个Activity中将一些数据传递到第二个Activity,由于某些原因,又要返回到第一个Activity中,并显示传递的数据。
这也可以通过Intent和Bundle来实现。与在两个Activity中交换数据不同的是,此处需要使用startActivityForResult()方法来启动另一个Activity。
ps:我也是刚刚才学,还没有用过这个函数,所以暂且不提供代码样例了,等到我以后用过之后,再补上。。。