Toast
Toast 是 Android 系统提供的一种非常好的提醒方式,在程序中可以使用它将一些短小的
信息通知给用户,这些信息会在一段时间后自动消失,并且不会占用任何屏幕空间,
menu–菜单
Intent
显式Intent和隐式Intent
可通过Intent来调用其他的应用程序,Android 多个应用程序之间的功能共享
在activity的Java文件中修改按钮的点击事件,这里采用了匿名内部类的方法。
Button button1=(Button)findViewById(R.id.button_1);
//匿名内部类
button1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(MainActivity.this,SecondActivity.class);
startActivity(intent);
}
});
}
intent返回数据给下一个活动
MainActivity中的代码
button1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String data="hello IntentData!";
Intent intent=new Intent(MainActivity.this,SecondActivity.class);
intent.putExtra("extra_data", data);
startActivity(intent);
}
});
secondActivity中
Intent intent=getIntent();
String data=intent.getStringExtra("extra_data");
Log.d("SecondActivity", data);
Activity 中还有一个 startActivityForResult()
方法也是用于启动活动的,但这个方法期望在活动销毁的时候能够返回一个结果给上一个活动。
//将信息返回给上一个活动 FirstActivity调用startActivityForResult
button1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(MainActivity.this,SecondActivity.class);
startActivityForResult(intent, 1);
}
});
然后在SecondActivity中重写点击事件
//传递数据给上一个活动
Button button2=(Button)findViewById(R.id.button_2);
button2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent();
intent.putExtra("data_return", "Hello FirstActivity");
setResult(RESULT_OK, intent);
finish();
}
});
secondactivity中的结果要返回到firstActity中,所以要重写onActivityResult
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case 1:
if(requestCode==RESULT_OK) {
String returnData=data.getStringExtra("data_return");
Log.d("MainActivity", returnData);
}
break;
default:
break;
}
}
用户在 SecondActivity 中并不是通过点击按钮,而是通过按下
Back 键回到 FirstActivity,
@Override
public void onBackPressed() {
Intent intent=new Intent();
intent.putExtra("data_return", "Hello MainACtity");
setResult(RESULT_OK,intent);
finish();
}
活动的生命周期
每开启一个活动,这个活动就会覆盖上一个活动,通过点击back和调用finsh方法会销毁最上面的活动,活动通过返回栈存储。
活动状态
- 运行状态,活动处于栈顶;系统不会回收;
- 暂停状态:活动不位于栈顶,但仍然可见;
- 停止状态:活动不位于栈顶,并且不可见;
- 销毁状态:活动已经移出栈,
Activity 类中定义了七个回调方法,覆盖了活动生命周期的每一个环节,下面我来一一 介绍下这七个方法。
- onCreate():这个方法你已经看到过很多次了,每个活动中我们都重写了这个方法,它会在活动第一次被创建的时候调用。你应该在这个方法中完成活动的初始化操作,比如说加载布局、绑定事件等。
- onStart():这个方法在活动由不可见变为可见的时候调用。
- onResume():这个方法在活动准备好和用户进行交互的时候调用。此时的活动一定位于返回栈的栈顶,并且处于运行状态。
- onPause():这个方法在系统准备去启动或者恢复另一个活动的时候调用。我们通常会在这个方法中将一些消耗 CPU 的资源释放掉,以及保存一些关键数据,但这个方法的执行速度一定要快,不然会影响到新的栈顶活动的使用。
- onStop():这个方法在活动完全不可见的时候调用。它和 onPause()方法的主要区别在于,如果启动的新活动是一个对话框式的活动,那么 onPause()方法会得到执行,而
onStop()方法并不会执行。- onDestroy():这个方法在活动被销毁之前调用,之后活动的状态将变为销毁状态。
- onRestart():这个方法在活动由停止状态变为运行状态之前调用,也就是活动被重新启动了。
以上七个方法中除了 onRestart()方法,其他都是两两相对的,从而又可以将活动分为 三种生存期。
- 完整生存期 活动在 onCreate()方法和 onDestroy()方法之间所经历的,就是完整生存期。一般情 况下,一个活动会在 onCreate()方法中完成各种初始化操作,而在 onDestroy()方法中完成释放内存的操作。
- 可见生存期 活动在 onStart()方法和 onStop()方法之间所经历的,就是可见生存期。在可见生存 期内,活动对于用户总是可见的,即便有可能无法和用户进行交互。我们可以通过这两个方法,合理地管理那些对用户可见的资源。比如在
onStart()方法中对资源进行加载,而在 onStop()方法中对资源进行释放,从而保证处于停止状态的活动不会占用过多内存。- 前台生存期 活动在 onResume()方法和 onPause()方法之间所经历的,就是前台生存期。在前台 生存期内,活动总是处于运行状态的,此时的活动是可以和用户进行相互的,我们平时看到和接触最多的也这个状态下的活动。
onSaveInstanceState()回调方法(会保证一定在活动被回收之前调用):在上一个活动被回收掉以后,在当前活动返回上一个活动的时候,能够保证上一个活动的临时数据被保存。以通过这个方法来解决活动被回收时临时数据得不到保存的问题。
例如在MainAcitivity中加入以下代码,对临时数据进行保存;
@Override
protected void onSaveInstanceState(Bundle outState) {
// TODO Auto-generated method stub
super.onSaveInstanceState(outState);
String tempData="something you just typed";
outState.putString("data_key", tempData);
}
恢复数据,在MainAcitivity的onCreat中
if(savedInstanceState!=null) {
String tempData=savedInstanceState.getString("data_key");
Log.d(TAG, tempData);
}
活动的启动模式
启动模式一共有四种,分别是 standard、singleTop、singleTask 和 singleInstance , 可 以 在 AndroidManifest.xml 中 通 过 给 标 签 指 定android:launchMode 属性来选择启动模式。
- standard:在 standard 模式(即默认情况)下,每当启动一个新的活动,它就会在返回栈中入栈,并处于栈顶的位置。对于使用standard 模式的活动,系统不会在乎这个活动是否已经在返回栈中存在,每次启动都会创建该活动的一个新的实例。
- singleTop:当活动的启动模式指定为 singleTop,在启动活动时如果发现返回栈的栈顶已经是该活动,则认为可以直接使用它,不会再创建新的活动实例。
- singleTask:每次启动该活动时系统首先会在返回栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把在这个活动之上的所有活动统统出栈,如果没有发现就会创建一个新的活动实例。
- singleInstance:指定为 singleInstance 模式的活动会启用一个新的返回栈来管理这个活动(其实如果 singleTask 模式指定了不同的 taskAffinity,也会启动一个新的返回栈)。在这种模式下会有一个单独的返回栈来管理这个活动,不管是哪个应用程序来访问这个活动,都共用的同一个返回栈,也就解决了共享活动实例的问题。
问题:logcat突然不能显示信息了,当前问题还没解决。
记录:《Android第一行代码》 第2章活动 53-83页