1.活动是什么
包含用户界面的组件,主要用于和用户进行交互。
2. 活动的基本用法
(1)android:id 元素当前唯一的标识符l android:width 元素宽度 android:height 元素高度。
(2)setContentView()方法给当前活动加载一个布局,必须要在AndroidManifest.xml中注册,但AS已经帮我们动态注册。
(3)Toast方法,较为简单。Toast.maketext().show()。
(4)在活动中使用Menu
- res目录下创建menu文件夹,创建Menu Resource file。添加item菜单项,菜单项包括了id与titile两个label。
- 重写OnCreateOptionMenu方法来加载布局。重写onOptionItemSelected方法来定义响应事件。
(5)销毁一个活动:Back键或finish方法。
3.使用Intent
(1)使用显式Intent
Intent是Android程序中各组件之间的一种交互方式。用于启动活动、服务以及发送广播。
Intent intent = new Intent(MainActivity.this,SecondActivity.clalss);
startAcitvity(intent);
(2)使用隐式Intent
- 在xml中设置,标签指明了当前活动可以响应com.nwu.hzk.ACTION_START这一活动,在隐式调用时必须加上标签为android.intent.category.DEFAULT。这样才能得到隐式Intent的响应。
- 系统去分析这个Intent,并找出合适的启动活动去启动。启动方法大致与显式相同,
Intent intent =new Intent(“com.nwu.hzk.ACTION_START”);
startActivity(intent);
3.更多隐式Intent的用法,比如调用浏览器,也可以用来打电话。
Intent intent =new Intent(Intent.ACTION_VIEW);
//指定Action为ACTION_VIEW
Intent.setData(Uri.parse(“http://www.baidu.com”));
(3)发送接受数据
1.传递数据:
intent.putExtra(“extra_data”,data);
第一个参数为键,第二个参数才是真正要传递的数据。
2.在另一个Activity中接收数据。
Intent intent = getIntent();
String data=intent.getStringExtra(“extra_data”);
3.返回数据给上一个活动
FirstActivity中,启动SecondActivity中增加
startActivityForResult(intent,1);
//1为请求码
SecondActivity中增加
setResult(RESULT_OK,intent);
//专门向上一个活动FirstActivity中来返回处理结果。
在 SecondActivity 被销毁之后会回调上一个活FirstActivity动的 onActivityResult()方法,因此我们需要在 FirstActivity 中重写这个方法来得到返回的数据
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case 1:
if (resultCode == RESULT_OK) {
String returnedData = data.getStringExtra("data_return"); Log.d("FirstActivity", returnedData);
}
break;
default:
}
}
4. 活动的Th存期
- onCreate()
这个方法你已经看到过很多次了,每个活动中我们都重写了这个方法,它会在活动 第一次被创建的时候调用。你应该在这个方法中完成活动的初始化操作,比如说加载布 局、绑定事件等。
- onStart()
这个方法在活动由不可见变为可见的时候调用。
- onResume()
这个方法在活动准备好和用户进行交互的时候调用。此时的活动一定位于返回栈的 栈顶,并且处于运行状态。
- onPause()
这个方法在系统准备去启动或者恢复另一个活动的时候调用。我们通常会在这个方法中将一些消耗 CPU 的资源释放掉,以及保存一些关键数据,但这个方法的执行速度一定要快,不然会影响到新的栈顶活动的使用。
- onStop()
这个方法在活动完全不可见的时候调用。它和 onPause()方法的主要区别在于,如果启动的新活动是一个对话框式的活动,那么 onPause()方法会得到执行,而 onStop() 方法并不会执行。
- onDestroy()
这个方法在活动被销毁之前调用,之后活动的状态将变为销毁状态。
7.onRestart()
这个方法在活动由停止状态变为运行状态之前调用,也就是活动被重新启动了。以上七个方法中除了 onRestart()方法,其他都是两两相对的,从而又可以将活动分为三种生存期。
5. 活动启动方式
通过在AndroidMAnifest.xml中标签中指定android:launchMode来确定启动方式。
1.standard:
系统不会在乎这个活动是否已经在返回栈中存在,每次启动都会创建该活动的一个新的实例。
2.singleTop:
在启动活动时如果发现返回栈的栈顶已经是该活动,则认为可以直接使用它,不会再创建新的活动实例。
3.singleTask:
每次启动该活动时系统首先会在返回栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把在这个活动之上的所有活动统统出栈,如果没有发现就会创建一个新的活动实例。
4.singleInstance
在这种模式下会有一个单独的返回栈来管理这个活动,不管是哪个应用程序来访问这个活动,都共用的同一个返回栈,也就解决了共享活动实 例的问题。
6. 活动最佳实例
1.知晓在当前哪一个活动
新建一个 BaseActivity 继承自
Activity,然后在 BaseActivity 中重写 onCreate()方法
Log.d("BaseActivity", getClass().getSimpleName());
让 BaseActivity 成为 项目中所有活动的父类。现在每当我们进入到一个活动的界面,该活动的类名就会被打印出来,这样我们就可以 时时刻刻知晓当前界面对应的是哪一个活动了。
2.随时随地推出程序
解决连按n次 Back 键才退出所有activity。按 Home 键只是把程序挂起,并没有退出程序的问题。
新建一个 ActivityCollector:
public class ActivityCollector {
public static List<Activity> activities = new ArrayList<Activity>(); public static void addActivity(Activity activity) {
activities.add(activity);
}
public static void removeActivity(Activity activity) {
activities.remove(activity);
}
public static void finishAll() {
for (Activity activity : activities) { if (!activity.isFinishing()) {
activity.finish();
}
}
在 BaseActivity 的 onCreate()方法中调用了 ActivityCollector 的 addActivity()方法,表明将当前正在创建的活动添加到活动管理器里。然后在 BaseActivity 中重写 onDestroy()方法, 并调用了 ActivityCollector 的 removeActivity()方法,表明将一个马上要销毁的活动从活动管理器里移除。
public class BaseActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); Log.d("BaseActivity", getClass().getSimpleName()); ActivityCollector.addActivity(this);
}
@Override
protected void onDestroy() {
super.onDestroy(); ActivityCollector.removeActivity(this);
}
}
然后只需要继承BaseActivity并调用 ActivityCollector.finishAll()方法就可以了。
3.启动活动的最佳写法
解决不同活动由不同的人编写的问题,这是你有两种方法:一个是你自己去阅读 SecondActivity 中的代码,二是询问负责编写 SecondActivity 的同事。
public class SecondActivity extends BaseActivity {
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);
}
}
SecondActivity 所需要的数据全部都在方法参数中体现出来了,这样即使不用阅读 SecondActivity 中的代码,或者询问负责编写 SecondActivity 的同事,你也可以非常清晰地知道启动 SecondActivity 需要传递哪些数据。
button1.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) { SecondActivity.actionStart(FirstActivity.this, "data1", "data2");
}
});