第二章 探究活动
创建一个工程的几个步骤(全空工程)
layout下创建新布局
新建包–新建类文件–继承Activity–重写
onCreate()
–方法中加入setContentView(R.layout.activity_main)
在Androidmanifest中注册
监听按钮的点击事件
匿名内部类监听按钮点击事件
初始化控件,
findViewById()
设置监听器
setOnClickListener()
外部类监听点击事件
初始化控件,
findViewById()
自定义外部类,extends OnClickListener接口,复写
onClick()
方法,实现点击事件设置控件的监听器
setOnClickListener()
;
接口方式监听按钮点击事件
初始化控件,
findViewById()
在当前类中implements OnClickListener接口,复写
onClick()
方法,实现多个按钮的点击事件- 设置控件的监听器
setOnClickListener(this)
;
设置控件属性的点击事件
在按钮中设置一个属性
android:onClick = "doClick"
;写入
doClick()
方法,用swtich实现多个按钮的点击事件
Intent(意图/信使)的使用
Intent是Android程序之间进行交互的一种重要方式,它不仅可以指明当前组件想要执行的动作,还可以在不同的组件之间传递数据。简单说就是Intent协助完成Android各个组件之间的通讯。
显示Intent
//FirstActivity.this为上下文,SecondActivity.class为目标活动
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
//启动活动
startActivity(intent);
//结果为通过FirstActivity活动打开SecondActivity活动
隐式Intent
一个Intent中只能指定一个action,但却能指定多个category,默认都有一个category:”android.intent.category.DEFAULT”
要响应Intent的活动中,在AndroidManifest中此活动需配置中的和
用Intent传递数据
//例如从活动FristActivity传递到SecondActivity
//FirstActivity中代码
String data = "Hello";
Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
//A是键值,B是传递的数据
intent.putExtra("A",B);
StartActivity(intent);
//SecondActivity中代码
Intent intent = getIntent();
//接收数据
String data = intent.getStringExtra("A");
返回数据给上一个活动
使用
startActivityForResult(intent, requestCode)
;第一个参数是Intent对象,第二个参数是请求的一个标识。复写
onActivityResult(requestCode, resultCode, intent)
; requestCode与上面方法中的值一致,resultCode与下面方法中的值一致。在第二个页面中使用
setResult(resultCode, intent)
; 第一个参数是第二个页面返回的标识;第二个参数是第二个页面回传的数据,回传的数据可以使用intent.putExtra(String name, "需要回传的数据内容")
;如果第二个页面是按BACK按钮返回,则在onBackPressed()
方法中使用setResult(resultCode, intent)
;if(resultCode == RESULT_OK && requestCode == requestCode){输出返回的数据内容}
,首先通过检查requestCode的值判断数据来源,确定数据是从SecondActivity返回的后再通过resultCode的值来判断处理结果是否成功,最后从intent中取值并打印,这样就完成了向上一个活动返回数据的工作。
活动的生命周期
- standard–在 standard 模式(即默认情况)下,每当启动一个新的活动,它就会在活动栈中入栈,并处于栈顶的位置。对于使用standard 模式的活动,系统不会在乎这个活动是否已经在活动栈中存在,每次启动都会创建该活动的一个新的实例
- singleTop–当活动的启动模式指定为 singleTop,在启动活动时如果发现活动栈的栈顶已经是该活动,则认为可以直接使用它,不会再创建新的活动实例。
- singleTask–当活动的启动模式指定为 singleTask,每次启动该活动时系统首先会在活动栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把在这个活动之上的所有活动统统出栈,如果没有发现就会创建一个新的活动实例。
- singleInstance– singleInstance 模式的活动会启用一个新的活动栈来管理这个活动(其实如果 singleTask 模式指定了不同的 taskAffinity,也会启动一个新的活动栈)
活动的最佳实践
BaseActivity,放一个活动集合实例,统一管理活动添加和销毁
知晓当前是哪个活动
1.
新建一个BaseActivity继承Activity,然后重写onCreate()
2.
Log.d("BaseActivity", getClass().getSimpleName())
3.
让项目中所有活动类继承BaseActivity
4.
运行程序,进入所有页面,观察LogCat打印信息
5.
每当我们进入到一个活动的界面,该活动的雷鸣就会打印出来,这样我们就可以知道当前界面对应的是哪一个活动了。
随时随地退出程序
创建一个ActivityCollector.java,此类用作收集和销毁activity的公共类.
创建一个BaseActivity.java基类,项目中的所有activity都继承此类.
让A, B, C这三个activity分别去继承BaseActivity.java.这样只要activity一起动,或者子activity中重写了
onDestroy()
方法,子activity就会自动的去收集activity,去销毁某个Activity.如何在某个地方需要一次销毁所有的activity,只需要调用ActivityCollector.java中的
finishAll()
方法.
启动活动的最佳写法
在我编写的每个活动中都添加类似actionStart()
的启动方法,此法的好处是一目了然,SecondActivity所需要的数据全部都在方法参数中体现出来了,即使不用阅读SecondActivity代码也可以知道启动SecondActivity需要传递哪些参数,同时也只需要一行代码就可以启动SecondActivity,简化了启动代码。
//在secondActivity中
public static void actionStart(Context context, String data1, String data2){
Intent intent = new Intent(context, SecondActivity.class);
intent.putExtra("param1", data1);
intent.putExtra("param2", data2);
context.startActivity(intent)
}
//在其他活动中调用actionStart()方法启动SecondActivity
SecondActivity.actionStart(FirstActivity.this, "data1", "data2");