读《安卓第一行代码》第二章
2.2活动的基本用法
2.2.1创建活动
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_main);加载布局,需要下节定义和创建布局
}
}
项目中的任何活动都应该重写Activity的onCreate()方法
2.2.2创建和加载布局
在 app/src/main/res/layout目录下创建布局文件,如first_layout.xml
<LinearLayout xmlns:android="http://schemas.androld.com/apk/res/android"
android:Orientation="vertical"
android:layoutwidth="matchparent"
android:layout_height="match_parent">
<Button
android:id="@+id/button_1"
android:layout_width="match_parent"
android:layoutheight="wrapcontent"
android:text="Button 1"/>
</LinearLayout>
android:id是给当前元素定义一个唯一的标识符,之后可以在代码中对这个元素进行操作 @id/button_1用于在XML中引用一个id @+id/button_1用于在XML中定义一个id android:layout_width指定元素宽度 android:layoutheight指定元素高度 wrap_content表示刚好包含内容 match_parent表示匹配父容器大小
通过在Activity中调用findViewById就可以取得button对象
2.2.3在AndroidManifest文件中注册
在application标签中加入
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.activitytest">
<application 省略属性>
<activity android:name=".FirstActivity"
android:label="Hello World"
>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
因为mainfest标签声明了package com.example.activitytest 所以.FirstActivity表示 com.example.activitytest.FirstActivity
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
表示First是程序的主活动,可以被系统桌面点击图标的方式启动
android:label="Hello World"表示标题栏(如果有)中的文字
2.2.4在活动中使用Toast
显示提示文字
Toast.makeText(FirstActivity.this,"Hello",Toast.LENGTH_SHORT).show(); 参数一Context 参数二显示字符串 参数三 Toast.LENGTH_SHORT 或 Toast.LENGTH_LONG 设置显示时长
2.2.5 在活动中使用菜单
略
2.2.6销毁活动
一般在主活动界面按BACK键就可以销毁活动
也可以调用活动的finish()方法销毁活动,效果与按BACK键一样
2.3使用Intent在活动间穿梭
Intent表示一个 "意图",可以看做一个封装了调用信息的消息对象,是安卓中各种组件间进行交互的一种方式 它指明组件想要执行的动作还可以在不同组件之间传递数据
它可以启动活动,服务,发送广播
Intetn分为两种,显式Intent和隐式Intent
2.3.1使用显式Intent
使用Intent的一个构造函数Intent(Context packageContext,Class<?> class) context要求提供一个启动活动的上下文 class则是指定想要启动的目标活动
Intent intent=new Intent(FirstActivity.this,SecondActivity.class)
startActivity(intent)
使用Activity类中的startActivity(Intent intent)方法就可以启动一个活动 显式Intent,明确指定了要启动哪一个Activity
2.3.2使用隐式Intent
隐式Intent,而不指定要启动哪一个Activity,指定了一系列信息 然后交由系统去分析这个Intent,并找到合适的活动去启动 通过在<activity>标签下配置<intent-filter>内容可以指定该活动能够响应 的action和category
action标签中指明了当前活动可以响com.example.activitytest.ACTION_START这个action,每个Activity中智能有一个 而category标签则包含了一些附加信息,更精确地指明了当前的活动能够响应的Intent中还可能带有的category,每个Activity中可以有多个 只有action和category中的内容同时能匹配上Intent中指定的action 和category时,这个活动才能响应该Intent
Intent intent=new Intent("com.example.activitytest.ACTION_START")
startActivity(intent)
这里使用了Intent的另一个构造函数,直接将action的字符串传入
android.intent.category.DEFAULT是一种默认category,调用startActivity()时,方法会自动将此category添加到Intent中
添加category的方法是调用intent.addCategory("android.intent.category.DEFAULT");
2.3.3更多Intent的用法
使用隐式Intent我们不仅可以启动自己程序内的活动,还可以启动其它程序的活动,比如“用浏览器打开”
Intent intent =new Intent(Intent.ACTION_VIEW);
Intent.setDate(Uri.Parse("http://www.baidu.com"));
startActivity(intent);
Intent.ACTION_VIEW是系统内置的一个动作android.intent.action.VIEW 通过parse方法解析字符串取得一个uri对象 调用setData()设置intent的属性 setData接受一个Uri对象作为数据
与它对应,intent-filter标签中可以配置一个data标签用于更精确地指定当前活动能够响应什么类型的数据 data标签中主要可以配置以下内容: android:scheme 指定协议部分 android:host 指定主机名 android:port 指定端口 android:path 端口后面的内容,包括路径 android:mimeType 指定数据类型,可以是通配符 只有data标签中的内容匹配intent的data时,活动才会响应
2.3.4 向下一个活动传递数据
button1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v){
String data=“He110SecondActivity
Intent intent=new Intent(FirstActivity.this,SecondActivity.Class);
intent.putExtra("extra_data",data);//对intent附加数据
StartActivity(intent)
}
}
public class SecondActivity extends AppCompatActivity{
@Override
protected void onCreate(BundtesavedInstanceState){
super.onCreate(savedInstanceState),
setContentView(R.layout,second_layout);
Intent intent=getlntent();
String data=intent.getStringExtra("extradata");
//取的intent中的数据,这里用getStringExtra,类似的还有getIntExtra等
Log.d("SecondActivity",data);
}
}
2.3.5 返回数据给调用此Activity的Activity
buttonl.set0nClickListener(new View.OnClickListener(){
@Override
publicvoidonClick(Viewv){
Inten tintent=newIntent(FirstActivity,this,SecondActiVity.Class);
StartACtivityForResu1t(intent,1);
//1是一个标识改调用的id,后面处理返回的方法用它来识别是哪个调用
}
}
public class SecondActivity extends AppCompatActivity{
@Override
protected void onCreate(BundIe savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.secondlayout);
Button button2=(Button)findViewById(R.id.button_2);
button2.setOnClickListener(newView.OnClickListener(){
@Override
public void Click(View v){
Intent intent=new Intent();
intent.putExtra("datareturn","Hello FirstActivity");
//此intent不包含什么意图,仅作传递数据用
setResult(RESULT_OK,intent);
finish();
}
}
FirstActivity的onActivityResult将被调用
@Override
protected void onActivityResult(int requestCode,int resultCode,Intent data){
switch(requestCode){
case 1:
if(resultCode==RESULT_OK){
String returnedData=data.getStringExtra("datareturn");
Log.d("FirstActivity",returnedData);
break;
}
}
}}
requestCode 唯一数字,用于标识是哪个被调用者 resultCode 被调用这传回的返回码,如RESULT_OK data 被调用者传回的intent
上面的实现必须在用户按下被调用活动的按钮时才会返回
我们还可以覆盖onBackPressed()方法,在用户按Back退出被调用Activity时返回数据
@Override
public void onBackPressed(){
Intent intent=new Intent();
intent.putExtra("datareturn","Hello FirstActivity");
setResult(RESULT_OK,intent);
finish();
}
2.4活动的生命周期
2.4.1 返回栈
Android使用任务(Task)来管理活动的,一组存放在栈里的活动的集 合,这个栈也被称作返回栈 每个应用上下文会有一个返回栈(而不是整个系统一个栈); 我们启动了一个新的活动,它会入栈,并处于栈顶; 当我们按下Back键或调用行finish()方法去销毁一个活动时; 处于栈顶的活动会出栈; 系统总是会显示处于栈顶的活动给用户; 如果栈底活动出栈,将退出应用,返回桌面
2.4.2 活动状态
1.运行 即栈顶活动
2.暂停 即非栈顶的可见活动,比如栈顶的活动不满屏或者透明,它叠在另一个可见活动上面
3.停止 非栈顶活动,且不可见
4.销毁 不再栈中的活动
系统内存不足时,按上面4321状态优先级,销毁活动
2.4.3 活动的生存期
onCreate()它会在活动第一次被创建的时候调用。你应该在这个方法中完成活动的初始化操作,比如 说加载布局、绑定事件等。
onStart()这个方法在活动由不可见变为可见的时候调用。 这个方法在活动准备好和用户进行交互的时候调用。此时的活动一定位于 返回栈的栈顶,并且处于运行状态。
onResume() 这个方法在系统准备去启动或者恢复另一个活动的时候调用。
onPause()我们通常会在 这个方法中将一些消耗CPU的资源释放掉,以及保存一些关键数据,但这个方法的执行 速度一定要快,不然会影响到新的栈顶活动的使用。
onstop()这个方法在活动完全不可见的时候调用,它和onpause()方法的主要区别在 于,如果启动的新活动是一个对话框式的活动,那么onpause()方法会得到执行,而 onStop()方法并不会执行
onDestroy()这个方法在活动被销毁之前调用,之后活动的状态将变为销毁状态。
onRestart()这个方法在活动由停止状态变为运行状态之前调用,也就是活动被重新 启动了
以上7个方法中除了onRestart()方法,其他都是两两相对的,从而又可以将活动分为3 种生存期。
完整生存期 活动在onCreate()方法和onDestroy()方法之间所经历的,就是完整生存 期。一般情况下,一个活动会在oncreate()方法中完成各种初始化操作,而在 onDestroy()方法中完成释放内存的操作
可见生存期。活动在onstart()方法和onstop()方法之间所经历的,就是可见生存期 在可见生存期内,活动对于用户总是可见的,即便有可能无法和用户进行交互。我们可 以通过这两个方法,合理地管理那些对用户可见的资源。比如在onstart()方法中对资 源进行加载,而在onstop()方法中对资源进行释放,从而保证处于停止状态的活动不会 占用过多内存。
前台生存期。活动在onResume()方法和onPause()方法之间所经历的就是前台生存期 在前台生存期内,活动总是处于运行状态的,此时的活动是可以和用户进行交互的,我 们平时看到和接触最多的也就是这个状态下的活动。
2.4.5 活动被回收了怎么办
Activity中提供了一个onSaveInstanceState()它 法在活动被回收之前一定会被调用。 onSaveInstanceState()方法会携带一个Bundle类型的参数,Bundle提供了一系列的方 法用于保存数据,比如可以使用putStnng()方法保存字符串,使用putlnt()方法保存整型数 据,以此类推。每个保存方法需要传人两个参数,第一个参数是键,用于后面从Bundle中取值
通过onCreate()的Bundle参数就可以取出保存的数据了
此外Bundle可以结合Intent使用 Bundle储存数据后可以放在Intent中 目标对象可以在Intent中通过Bundle取出数据
2.5活动的启动模式
在activity标签中添加属性 android:launchMode="启动模式"
2.5.1 standard (默认)
系统不管栈中是否存在该活动,启动活动时总是创建新的活动实例置于栈顶
2.5.2 singleTop
如果栈顶的活动就是要启动的活动,那么直接使用它,不创建新的活动实例 不在栈顶的活动依然和默认一样处理
2.5.3 singleTask
只要在栈中存在,就直接用它
2.5.4 singleInstance
启用独立的栈来管理活动,多个调用该活动的应用可以共享该栈