从心开始学Android:Activity

来源:互联网 发布:天下无敌指标源码 编辑:程序博客网 时间:2024/04/30 14:23

一、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中重写这个方法,

@Overrideprotected 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()这个方法,

@Overridepublic 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.





    


0 0
原创粉丝点击