一、AndroidManifest文件中注册
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity
Activity的注册声明要放在<application>标签下,name是包名,label是activity中标题栏的内容,<intent-filter>标签下的两句声明是让这个Activity作为这个程序的主活动,即打开程序的时候最先打开的就是这个界面。如果一个程序中没有主Activity,虽然这个程序也是可以安装的,但是你无法在启动器中看到或者打开这个程序。这种程序一般都是第三方调用的。
二、隐藏标题栏
当我们需要隐藏掉标题栏的时候,有以下两种方法:
1、在代码中隐藏:我们可以在oncreat();方法中加入
requestWindowFeature(Window.FEATURE_NO_TITLE);
注意:这行代码的意思就是不在活动中显示标题栏,但是这行代码一定要写在 setContentView();前面,不然会报错;
2、在AndroidManifest文件中修改:在<application>标签下加上android:theme="@android:style/Theme.NoTitleBar"
三、界面跳转和数据的传递:Intent
Intent的用法大致分为显示意图和隐示意图两种:
1、显示Intent的用法
Intent intent = new Intent(MainActivity.this,MainActivityTwo.class);
startActivity(intent);
intent接收到的两个参数,第一个是Context是启动活动的上下文,第二个参数Class是要跳转到的Activity;由于这种启动Activity的方式非常明显,因此被称为显示Intent。
2、隐式Intent的用法
相比较于显示Intent的用法,隐式意图就比较含蓄,隐式意图启动activity是通过指定activity的action和category信息,让系统自己去分析这个intent,并找到相匹配的activity.
要跳转到的activity的信息:
<activity android:name=".MainActivityTwo" >
<intent-filter>
<action android:name="android.intent.action.ACTION_TEST" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<action>标签中是当前activity可以响应的action,而<category>中则是包含了一些附加的信息,这些信息更加精确的指出课当前activity能够响应的intent中还可能带有的category,只有当<action>和<category>同时匹配到intent中的action和category的时候,这个activity才能够响应该intent。这个使用隐式Intent进行跳转的写法:
Intent intent = new Intent("android.intent.action.ACTION_TEST");
startActivity(intent);
这里之所以没有指定category,是因为android.intent.category.DEFAULT是一种默认的category,在调用startActivity()方法的时候会自动将这个category加到intent;这里需要说明的是,一个intent只能指定一个action,但是却可以有多个category,当在intent中增加一个category的时候:
Intent intent = new Intent("android.intent.action.ACTION_TEST");
intent.addCategory("android.intent.category.MY_DEFAULT");
startActivity(intent);
可以使用addCategory()方法添加一个category,此时AndroiManifest文件下activity的应添加上相对应的<category>,不然系统找不到响应intent的activity
就会报错;
<activity
android:name=".MainActivityTwo" >
<intent-filter>
<action android:name="android.intent.action.ACTION_TEST" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.MY_DEFAULT" />
</intent-filter>
</activity>
3、隐式意图的更多用法
使用隐式intent,我们不仅可以启动自己程序内的activity,还可以启动其他程序的activity,使Android的多个程序间的功能共享成为可能,例如显示一个网页
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.baidu.com"));
startActivity(intent);
这里我们首先设置了intent的action是Intent.ACTION_VIEW,这是Android系统的内置动作,它的常量值为android.intent.action.VIEW。然后通过Uri.parse()将一个网址字符串解析成一个Uri对象,在调用Intent的setData()方法将这个Uri对象传进去。
在<intent-filter>下的<data>的标签中我们可以配置以下内容:
1) android:scheme 用于指定数据的协议部分,如http协议,geo表示地理位置,tel表示拨打电话Uri.parse("tel:123456")
2) android:host 用于指定数据的主机名部分,如上面的www.baidu.com部分
3) android:post 用于指定数据的端口部分,一般紧跟主机名之后
4) android:path 用于指定主机名和端口之后的部分,如一段网址中跟在域名之后的部分
5) android:mimeType 用于指定处理的数据类型。
4、使用intent传递数据
传送数据:
Intent intent = new Intent(MainActivity.this,MainActivityTwo.class);
intent.putExtra("extra_data", data);
startActivity(intent);
putExtra()方法接收两个参数,第一个是键,第二个是数据,键是为了从intent中取值
接收数据:
Intent intent2 = getIntent();
String data = intent2.getStringExtra("extra_data");
5、返回数据给上一个activity
Android既可以传递数据给下一个Activity,也可以返回数据给上一个activity,Activity中有个startActivityForResult()方法,这个方法也是用于启动activity的,只不过这个方法是期待activity在销毁的时候能够返回一个结果给上一个activity,这个方法接收两个参数,第一个是Intent,第二个是请求码(int类型,是一个唯一值就行),用于判断数据的来源。
在第一个activity中:
Intent intent = new Intent(MainActivity.this,MainActivityTwo.class);
startActivityForResult(intent, 1);
在第二个activity中:
Intent intent = new Intent();
intent.putExtra("extra_data", data);
setResult(RESULT_OK, intent);
finish();
这里的intent只用来传递数据,setResult()方法是专门用来向上一个activity返回数据的,接收两个参数,第一个是用来向上一个activity返回处理结果的,一般只用RESULT_OK或者RESULT_CANCELED这两个值,第二个参数是传入intent。最后调用finish()方法销毁activity,由于我们是使用startActivityForResult()方法来启动activity的,
因此在第二个activity销毁的时候,会调用上一个activity的onActivityResult()方法,因此我们需要在第一个activity中重写这个方法,
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case 1:
if (resultCode == RESULT_OK) {
String returndata = data.getStringExtra("extra_data");
}
break;
default:
break;
}
}
startActivityForResult()有三个参数,第一个requestCode就是我们启动第二个activity时请求码,第二个参数resultCode就是返回数据时的处理结果,第三个参数就是携带返回数据的intent。当用户是通过点击返回键回到第一个activity的时候,我们需要重写onBackPressed()这个方法,
@Override
public void onBackPressed() {
Intent intent = new Intent();
intent.putExtra("extra_data", data);
setResult(RESULT_OK, intent);
<span style="white-space:pre"> </span> <span style="white-space:pre"> </span>finish();
}
当点击返回键的时候就会执行上面的代码。
四、activity的生命周期
1、onCreate () :第一次被创建的时候调用
2、onStart() :这个方法由不可见的变为可见的时候调用
3、onResum() :这个方法在activity准备好和用户进行交互的时候调用,
4、onPause() :
5、onStop()
6、onDestroy()
7、onRstart()
这七个方法除了onDestroy(),其他的都是两两相对应的
五、activity的启动模式
activity有四种启动模式:standard , singleTop, singleTask 和singleInstance,启动模式可以在AndroidManifest文件中的<activity>标签中进行指定.
<activity
android:name=".MainActivityTwo"
android:launchMode="singleTop">
</activity>
1、standard模式
standard模式又称为标准模式,是默认的启动模式,这个模式下,每启动一个activity,它都会在返回栈中入栈,并且处于栈顶的位子,无论这个栈中是否已经存在这个activity.
2、singleTop模式
singleTop模式是当启动activity的时候,如果发现返回栈的栈顶是该activity,那么就不会创建新的activity,但是当返回栈的栈顶不是该activity时候,那么
返回栈还是创建新的activity.
3、singleTask 模式
singleTask模式是当启动activity的时候,如果发现返回栈中存在该activity,如果存在那么就不会创建新的activity,直接使用,并把这个activity上的所有
activity统统挤出栈,如果没有发现就会创建一个新的activity
4、singleInstance模式
singleInstance模式是一种比较特殊的模式,这种模式下,会创建一个新的返回栈,用来专门管理这个activity,并且保证不会有其他的activity进入.例如从
FirstActivity跳转到SecondActivity,再从SecondActivity跳转到ThirdActivity,其中SecondActivity的启动模式是singleInstance,那么此时按返回键的时候就会从
ThirdActivity返回到FirstActivity.