七月中旬正式进入公司,八月初正式开始接触android。三个多月以来,一直没些什么东西,这一篇是首秀,后面还会陆续写一些 。对自己了解到的一些东西做一下总结。下面进入正题,Android有四大组件:activity、service、content provider和broadcast。今天先来说说activity。
活动主要用于用户交互,它最容易吸引到用户,可以包含用户界面的组件,也可以只在里面添加逻辑。一个App里面可以包含一个或者多个activity,不包含任何activity的应用基本没有。
activity包括它的创建,布局构造,多个活动之间的交互,生命周期等等。activity的创建要根据开发平台来处理,eclipse和android studio的创建方法类似,属于基本操作。创建完成一个activity之后,系统会自动生成一个layout文件(用于调整这个activity的布局)并且在Androidmanifest中注册这个活动(平台一般会自动生成):
package="com.example.activity"
<application
android:allowBackup=="true"
android:icon="@mipmap/ic_lunch"
android:lable="@string/app_name"
android:supportRtl="true"
android:theme="@style/AppTheme"
<activity android:name=".FirstActivity"></activity>
allowbackup:是否允许返回 icon:图标 lable:标题栏的内容
theme:页面风格,后面toolbar的时候会用到这个东西。
name:活动名称
在activity的主界面会自动重写onCreate这个方法,这个方法里面添加要在页面上的显示的内容逻辑。除了onCreate之外还有onStart、onResume、onPause、onStop,onDestory、onRestart。
onCreate:在活动第一次创建的时候调用,加载布局,绑定事件。
onStart:每次活动由不见变为可见的是时候调用。
onResume:在活动准备好与用户进行交互的时候调用,此时活动位于返回栈的栈顶。
onPause:在系统准备去启动或者恢复另一个活动的时候调用,在此过程中将消耗cpu的资源释放掉,且速度要快
onStop:活动完全不可见时调用。
onDestory:活动被销毁前调用,之后变为销毁态。
onRestart:由停止态转换为运行状态之前调用。
上面的顺序也是一个活动的生命周期。onStart可以添加影响app界面状态的接口调用逻辑。onResume里面添加界面的刷新相关的逻辑。活动的生命周期是一个返回栈的结构。主要有四个状态:
运行态:活动位于栈顶时,就是运行态
暂停状态:活动不在栈顶,但仍然可见
停止态:活动不在栈顶且不可见,系统会为它保留相应状态和成员变量,但空间不足时,系统会将其回收。
销毁态:活动从返回栈移除时,就处于销毁态,可以保证内存充足。
完整生存期。活动在onCreate()方法和 onDestroy()方法之间所经历的,就是完整生存期。一般情况下,一个活动会在 onCreate()方法中完成各种初始化操作,而在onDestroy()方法中完成释放内存的操作。
可见生存期:活动在 onStart()方法和 onStop()方法之间所经历的,就是可见生存期。在可见生存期内,活动对于用户总是可见的,即便有可能无法和用户进行交互。我们可以通过这两个方法,合理地管理那些对用户可见的资源。比如在 onStart()方法中对资源进行加载,而在 onStop()方法中对资源进行释放,从而保证处于停止状态的活动不会占用过多内存。
前台生存期。活动在 onResume()方法和 onPause()方法之间所经历的就是前台生存期。在前台生存期内,活动总是处于运行状态的,此时的活动是可以和用户进行交互的,我们平时看到和接触最多的也就是这个状态下的活动。
Intent用于一个活动唤醒另一个活动:
显式调用
Intent intent =new Intent(FirstActivity.this,SecondActivity.class);
startActivity(intent);
隐式调用:
<action android:name="com.example.activitytest.ACTION_START"/>
<category android:name="com.intent.category.DEFAULT"/>
Intent intent = new Intent("com.example.activitytest.ACTION_START");
startActivity(intent);
在系统调用startActivity的时候会自动把android.Intent.category加到Intent里面去。必须action和category都匹配上才可以启动相对应的活动。
关于Intent intent=new Intent(Intent.ACTION_VIEW);
Intent.setData(Uri.prase("+网址"))
先指定Intent的action是ACTION_VIEW这是一个内置的常量,后面setData来调用资源,把网址解析成uri传进去。相对应的可以在<intent_filter>这里添加标签,详细说明是什么类型的数据。数据类型有:http、host、part、path、mimetype。写法如下
<data android:scheme="http"/>
打电话,打开另一个app都可以通过类似的方式实现。
接下来就是Intent来传递数据了
A页面:
Intent intent=new Intent(Firstactivity.this,secondactivity.class);
intent.putextrra=("extra——data",data); //第一个参数是键,第二个是带着内容的参数。
B接受页面:
Intent intent=getIntent();
String data=intent.getStringExtra("extra_data");
这时候data就读取到了前一个页面的信息data了。
返回数据给前一个activity:
A页面:startActivityForResult(intent,1);
B页面:Intent intent =new Intent ;
intent.putExtra=("data_extra","hello");
setResult(RESULT_OK,intent);
finish;
最后来说一说Activity的启动模式:
standard 是活动默认的启动模式,在不进行显式指定的情况下,所有活动都会自动使用这种启动模式。因此,到目前为止我们写过的所有活动都是使用的 standard 模式。经过上一节的学习,你已经知道了 Android 是使用返回栈来管理活动的,在 standard 模式(即默认情况)下,每当启动一个新的活动,它就会在返回栈中入栈,并处于栈顶的位置。对于使用 standard 模式的活动,系统不会在乎这个活动是否已经在返回栈中存在,每次启动都会创建该活动的一个新的实例。
singleTop可能在有些情况下,你会觉得 standard 模式不太合理。活动明明已经在栈顶了,为什么再次启动的时候还要创建一个新的活动实例呢?别着急,这只是系统默认的一种启动模式而已,你完全可以根据自己的需要进行修改,比如说使用 singleTop 模式。当活动的启动模式指定为singleTop,在启动活动时如果发现返回栈的栈顶已经是该活动,则认为可以直接使用它,不会再创建新的活动实例。
singleTask使用 singleTop 模式可以很好地解决重复创建栈顶活动的问题,但是正如你在上一节所看到的,如果该活动并没有处于栈顶的位置,还是可能会创建多个活动实例的。那么有没有什么办法可以让某个活动在整个应用程序的上下文中只存在一个实例呢?这就要借助 singleTask 模式来实现了。当活动的启动模式指定为 singleTask,每次启动该活动时系统首先会在返回栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把在这个活动之上的所有活动统统出栈,如果没有发现就会创建一个新的活动实例。
singleInstance 模式应该算是 4 种启动模式中最特殊也最复杂的一个了,你也需要多花点功夫来理解这个模式。不同于以上 3 种启动模式,指定为 singleInstance 模式的活动会启用一个新的返回栈,在每一次启动页面的时候会调用这个回栈来管理这个活动(其实如果 singleTask 模式指定了不同的 taskAffinity,也会启动一个新的返回栈。后面会详细来说一说activity的启动模式。
第一篇暂时就这样吧。