Activity教程

隐藏标题栏

在onCreate()方法中使用

requestWindowFeature(Window.FEATURE_NO_TITLE);

使用Toast

  1. Toast是一种非常好的提醒方式,弹出一个小消息,过一段时间自动小时
  2. 代码如下:
    Toast.makeText(FirstActivity.this, "You clicked Button 1",Toast.LENGTH_SHORT).show();
    
  3. 三个参数说明:
    1. Context:Toast要求的上下文,Acitivity本身就是一个Context对象;
    2. 显示的文本内容;
    3. 显示的时长:Toast.LENGTH_SHORT,Toast.LENGTH_LONG。

使用Menu

  1. 在res/menu/目录下新建一个menu.xml文件;
    <menu xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
    android:id="@+id/add_item"
    android:title="Add"/>
    <item
    android:id="@+id/remove_item"
    android:title="Remove"/>
    </menu>
    
  2. 在Activity中重写onCreateOptionsMenu()方法
    public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
    }
    
  3. 菜单响应事件:重写onOptionsItemSelected(MenuItem item)方法:
    	public boolean onOptionsItemSelected(MenuItem item) {
    		switch (item.getItemId()) {
    		case R.id.add_item:
    		Toast.makeText(this, "You clicked Add", Toast.LENGTH_SHORT).show();
    		break;
    		case R.id.remove_item:
    		Toast.makeText(this, "You clicked Remove", Toast.LENGTH_SHORT).show();
    		break;
    		default:
    		}
    
    1. 通过item.getItemId()获得点击的菜单项目

Intent使用

  1. Intent是Android各个组建之间进行交互的方式,还可以在组件之间传递数据,Intent可以启动Activity、Service、Broadcast;
  2. Intent有两种:显式Intent和隐式Intent

显式Intent

Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivity(intent);

说明

  1. Context:启动活动的上下文;
  2. class:想要启动的目标活动;
  3. 可以按Back键销毁当前启动的活动;

隐式Intent

Manifest.xml文件

<activity android:name=".SecondActivity" >
	<intent-filter>
		<action android:name="com.example.activitytest.ACTION_START" />
		<category android:name="android.intent.category.DEFAULT" />
	</intent-filter>
</activity>

Activity中代码

Intent intent = new Intent("com.example.activitytest.ACTION_START");
startActivity(intent);

说明

  1. 这个文件Manifest.xml中注意<action>和<category>这两个标签;
  2. 在Activity中构建Intent时,需要添加Manifest文件中的<action> <category>这两个标签中的内容;
  3. 例子中的为default中,所以在Activity中不用指定,如果是其他的,则必须在Intent中指定,使用intent.addCategory()方法指定。

其他隐式Intent用法

  1. 隐式Intent启动其他程序的活动:
    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setData(Uri.parse("http://www.baidu.com"));
    startActivity(intent);
    

说明

  1. Intent.ACTION_VIEW:是一个系统内的动作;
  2. Uri.parse():将一个网址解析成一个URI对象;通过intent.setData传递进去;
  3. Intent.ACTION_DIAL:启动拨盘;

Intent传递数据

intent.putExtra("extra_data",data);
Intent intent = getIntent();
String data = intent.getStringExtra("extra_data");

说明:

  1. 第一个参数是键;
  2. 第二个参数是真正的数据。
  3. getIntent():获得用于启动Activity的Intent,然后通过intent.getStringExtra()获得传递的参数;

返回数据给上一个活动

A class:

Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
startActivityForResult(intent, 1);
	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:
		}
	}

B class:

Intent intent = new Intent();
intent.putExtra("data_return", "Hello FirstActivity");
setResult(RESULT_OK, intent);
public void onBackPressed() {
	Intent intent = new Intent();
	intent.putExtra("data_return", "Hello FirstActivity");
	setResult(RESULT_OK, intent);
	finish();
}

说明

  1. startActivityForResult();第二个参数是请求码,用于判断是否从B class中返回的。
  2. B class中的setResult():第一个参数向上一个活动返回处理结果,一般是RESULT_OK,RESULT_CANCELED;第二个参数则是把带有的数据传递回去;
  3. A class的onActivityResult()方法获得B class传递的参数,三个参数:resultCode(A class中传递的请求码,通过requestCode来判断数据的来源;resultCode判断处理结果是否成功,即B class的setResult中存入的RESULT_OK;第三个参数Intent则是获取数据;
  4. B classde onBackPressed()方法是响应当用户按下Back键时也是向A class返回相应的数据;

Activity生命周期

活动状态

  1. 运行状态:活动位于返回栈的栈顶是,活动就处于运行状态;
  2. 暂停状态:活动不处于栈顶,但是仍然可见,活动进入暂停状态。如:对话框形式的活动只占用屏幕的部分区域。暂停状态的活动仍然存活。
  3. 停止状态:活动不再处于栈顶位置,并且完全不可见。
  4. 销毁状态:活动从返回栈中移除。

活动的生存周期

  1. onCreate:活动第一次被创建时调用,在这个方法中完成初始化操作;
  2. onStart:活动不可见变为可见时调用;
  3. onResume:活动准备与用户进行交互是调用,活动此时一定位于返回栈的栈顶并处于运行状态;
  4. onPause:方法在准备区启动或者恢复另一个活动时调用;
  5. onStop:活动完全不可见时调用,与onPause区别在于,onPause在启动新活动是一个对话框的活动是调用,而onStop不会执行;
  6. onDestroy:活动被销毁之前调用;
  7. onRestart:活动由停止变为运行状态调用,即活动被重新启动了。
  8. 以上7个活动,除onRestart其他都是两两相对。

活动的三种生存周期

  1. 完整生存期:活动在onCreate和onDestroy方法之间的经历;
  2. 可见生存期:活动在onStart和onStop之间的经历,可见生存周期内,活动对于用户总是可见的,即使无法与用户进行交互。
  3. 前台生存期:活动在onResume和onPause之间的经历,前台生存期内活动总是处于运行状态,此时活动可以和用户交互。

保存活动状态

当一个活动进入停止状态,活动有可能被系统回收。为了用户体验,切换Activity时,应该将活动的状态咱是保存下来。

保存Activity状态

重写SaveInstanceState()方法


protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
String tempData = "Something you just typed";
outState.putString("data_key", tempData);
}

读取保存的数据,在onCreate方法中

if (savedInstanceState != null) {
String tempData = savedInstanceState.getString("data_key");
Log.d(TAG, tempData);
}

说明

  1. Intent还可以和Bundle一起传递数据,先将数据保存在Bundle对象中,再将Bundle对象保存在Intent中,到了目标Activity后先从Intent中取出Bundle。再从Bundle中取出数据。

活动的启动模式

活动的启动模式有4种:standard、singleTop、singleTask、singleInstance。可以在AndroidManifest.xml中通过<activity>标签指定android:launchMode属性指定启动模式。

standard

默认启动模式,每启动一个新活动,就会返回栈。系统不会在乎活动是否已经在在返回栈中存在,每次都会创建活动的新实例。

singleTop

启动活动时如果范县返回栈的栈顶已经是该活动,则认为可以直接使用他,不会再创建新的活动实例。

<activity
android:name=".FirstActivity"
android:launchMode="singleTop"
android:label="This is FirstActivity" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>

singleTask

每次启动该活动首先在返回栈中检查是否存在该活动的实例,如果已存在该实例,则把这个活动出栈,没有则新建新的活动实例。

singleInstance

活动的最佳实践

知晓当前在哪一个活动

根据程序当前的界面判断在哪一个活动。

getClass().getSimpleName();

随时随地退出程序

用一个专门的集合类对所有的活动进行管理。

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();
			}
		}
	}
}

通过List来管理活动;通过finishAll来将所有活动销毁。

启动活动的最佳写法

解决从哪个活动启动下一个活动模糊的问题。

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.actionStart(FirstActivity.this, "data1", "data2");

可以传递目标Activity和参数,即可启动。