赞
踩
前面的博文介绍了Activity,可能学的还不太爽哦,所以接下来学习android的Intent,它是android的信使,可以进行各个组件之间进行通信了。我依然在前面的基础上进行修改开发,免的啰嗦过多的东西。没看过前面的博文的,可以先看android学习二(Activity),好了,接下来开始吧。
使用显示的Intent
1.在前面的ActivityTest基础上,我们在创建一个布局文件,文件名为second_layout.xml,代码如下:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical" >
-
- <Button
- android:id="@+id/button_2"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="button 2"
- />
-
- </LinearLayout>
- package com.wj.test;
-
- import android.app.Activity;
- import android.os.Bundle;
- import android.view.Window;
-
- public class SecondActivity extends Activity {
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onCreate(savedInstanceState);
- requestWindowFeature(Window.FEATURE_NO_TITLE);
- setContentView(R.layout.second_layout);
- }
-
-
- }
3.进行注册活动,在AndroidManifest.xml中进行活动的注册,代码如下:
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="com.wj.test"
- android:versionCode="1"
- android:versionName="1.0" >
-
- <uses-sdk
- android:minSdkVersion="17"
- android:targetSdkVersion="17" />
-
- <application
- android:allowBackup="true"
- android:icon="@drawable/ic_launcher"
- android:label="@string/app_name"
- android:theme="@style/AppTheme" >
- <activity
- android:name="com.wj.test.FirstActivity"
- android:label="this is firstactivity">
- <intent-filter >
- <action android:name="android.intent.action.MAIN"/>
- <category android:name="android.intent.category.LAUNCHER"/>
- </intent-filter>
- </activity>
-
- <activity android:name=".SecondActivity">
- </activity>
-
- </application>
-
- </manifest>
- button1.setOnClickListener(new OnClickListener(){
-
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- /* Toast.makeText(FirstActivity.this, "you clicked button1",
- Toast.LENGTH_SHORT).show();*/
- /*
- * Intent的使用分为显示的Intent和隐式的Intent,下面的是显示的Intent
- * Intent有多个构造函数,我使用的是一个简单的的,第一个参数Context要求提供一个启动
- * 活动的上下文,第二个参数Class则是指定想要启动的目标活动,通过这个构造函数构建出Intent
- * 的“意图”,然后使用startActivity(intent);启动目标活动。
- * Intent是android程序中个组件之间进行交互的一种重要的方式,它不紧可以指明当前组想要执行
- * 的动作,还可以在不同组件之间传递数据。Intent一般可被用于启动活动,服务,以及发送广播等。
- * */
- Intent intent=new Intent(FirstActivity.this,
- SecondActivity.class);
- startActivity(intent);
- }
-
- });
5.重写运行程序,点击button1,将跳转到SecondActivity
运行结果如上图所示,上面的就是显示的进行Intent显示的使用,应为指明了将跳转到哪一个类。下面我们在说说,怎么使用隐式的使用。
使用隐式的Intent
相比与显示的Intent,隐式的Intent含蓄了很多,它并不指明我们想要启动哪一个活动,而是指定了一系列的aciton和category等信息,然后交由系统去分析这个intent,并帮我们找出合适的活动去启动。
1.在上面的基础上我们修改成隐式的Intent,首先改写AndroidManifest.xml里面的<activity android:name=".SecondActivity">,为该注册的活动,进行intent-filter的配置,配置的内容如下:
- <activity android:name=".SecondActivity">
- <intent-filter>
- <action android:name="com.wj.test.activitytest.ACTION_START"> </action>
- <category android:name="android.intent.category.DEFAULT"/>
- </intent-filter>
- </activity>
注意
<action android:name="com.wj.test.activitytest.ACTION_START"> </action>里面的android:name,是可以自己定义的,指不过在创建Intent的时候要保证和这里的字符串一致就ok了。在aciton标签中我们指明了当前活动可以响应com.wj.test.activitytest.ACTION_START这个action,而<category>标签则包含了一些附加的信息,更精确的指明了当前活动能够响应的Intent中还可能带有的category。只有<action>和<category>中的内容同时能够匹配上Intent中指定的action和category时,这个活动才能响应该Intent。
2.修改FirstActivity中按钮的点击事件,代码如下:
- button1.setOnClickListener(new OnClickListener(){
-
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- /* Toast.makeText(FirstActivity.this, "you clicked button1",
- Toast.LENGTH_SHORT).show();*/
- /*
- * Intent的使用分为显示的Intent和隐式的Intent,下面的是显示的Intent
- * Intent有多个构造函数,我使用的是一个简单的的,第一个参数Context要求提供一个启动
- * 活动的上下文,第二个参数Class则是指定想要启动的目标活动,通过这个构造函数构建出Intent
- * 的“意图”,然后使用startActivity(intent);启动目标活动。
- * Intent是android程序中个组件之间进行交互的一种重要的方式,它不紧可以指明当前组想要执行
- * 的动作,还可以在不同组件之间传递数据。Intent一般可被用于启动活动,服务,以及发送广播等。
- * */
- /*Intent intent=new Intent(FirstActivity.this,
- SecondActivity.class);
- startActivity(intent);*/
-
- //使用隐式的Intent
- Intent intent=new Intent("com.wj.test.activitytest.ACTION_START");
- startActivity(intent);
- }
-
- });
重写运行程序,将出现和显示的Intent一样的效果。
注意:每个Intent中只能指定一个action,但却能指定多个category。下面我们在添加一个category吧。
3.修改FirstActivity中按钮的点击事件,代码如下:
- button1.setOnClickListener(new OnClickListener(){
-
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- /* Toast.makeText(FirstActivity.this, "you clicked button1",
- Toast.LENGTH_SHORT).show();*/
- /*
- * Intent的使用分为显示的Intent和隐式的Intent,下面的是显示的Intent
- * Intent有多个构造函数,我使用的是一个简单的的,第一个参数Context要求提供一个启动
- * 活动的上下文,第二个参数Class则是指定想要启动的目标活动,通过这个构造函数构建出Intent
- * 的“意图”,然后使用startActivity(intent);启动目标活动。
- * Intent是android程序中个组件之间进行交互的一种重要的方式,它不紧可以指明当前组想要执行
- * 的动作,还可以在不同组件之间传递数据。Intent一般可被用于启动活动,服务,以及发送广播等。
- * */
- /*Intent intent=new Intent(FirstActivity.this,
- SecondActivity.class);
- startActivity(intent);*/
-
- //使用隐式的Intent
- Intent intent=new Intent("com.wj.test.activitytest.ACTION_START");
- intent.addCategory("com.wj.activitytest.MY_CATEGORY");
- startActivity(intent);
- }
-
- });
4.修改后你在运行一下程序,就会发现程序崩溃了,看错误信息,你会发现10-27 01:03:47.937: E/AndroidRuntime(2824): android.content.ActivityNotFoundException: No Activity found to handle Intent { act=com.wj.test.activitytest.ACTION_START cat=[com.wj.activitytest.MY_CATEGORY] },提示我们没有任何活动可以响应我们的Intent,这是因为我们添加了intent.addCategory("com.wj.activitytest.MY_CATEGORY");,而SecondActivity的<intent-filter>标签中并没有声明这个category,所以就出现了没有任何活动可以响应Intent的情况。我们对<intent-filter>添加category的声明。
- <activity android:name=".SecondActivity">
- <intent-filter>
- <action android:name="com.wj.test.activitytest.ACTION_START"> </action>
- <category android:name="android.intent.category.DEFAULT"/>
- <category android:name="com.wj.activitytest.MY_CATEGORY"/>
- </intent-filter>
- </activity>
更多隐式Intent的用法
打开一个指定的页面的浏览器
1.修改FirstActivity中按钮点击事件的代码,主要代码如下
- button1.setOnClickListener(new OnClickListener(){
-
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- /* Toast.makeText(FirstActivity.this, "you clicked button1",
- Toast.LENGTH_SHORT).show();*/
- /*
- * Intent的使用分为显示的Intent和隐式的Intent,下面的是显示的Intent
- * Intent有多个构造函数,我使用的是一个简单的的,第一个参数Context要求提供一个启动
- * 活动的上下文,第二个参数Class则是指定想要启动的目标活动,通过这个构造函数构建出Intent
- * 的“意图”,然后使用startActivity(intent);启动目标活动。
- * Intent是android程序中个组件之间进行交互的一种重要的方式,它不紧可以指明当前组想要执行
- * 的动作,还可以在不同组件之间传递数据。Intent一般可被用于启动活动,服务,以及发送广播等。
- * */
- /*Intent intent=new Intent(FirstActivity.this,
- SecondActivity.class);
- startActivity(intent);*/
-
- //使用隐式的Intent
- /*Intent intent=new Intent("com.wj.test.activitytest.ACTION_START");
- intent.addCategory("com.wj.activitytest.MY_CATEGORY");
- startActivity(intent);*/
-
- //更多隐式的Intent的用法
- //打开浏览器
- /*
- * 这里我们指定了Intent的action是Intent.ACTION_VIEW,这是一个android系统内置的动作,
- * 其常量为android.intent.action.VIEW,然后通过Uri.parse方法,将一个网址字符串解析成一个
- * Uri对象,在调用Intent的setData()方法将这个对象传递进去。
- * */
- Intent intent=new Intent(Intent.ACTION_VIEW);
- intent.setData(Uri.parse("http://www.baidu.com"));
- startActivity(intent);
-
- }
-
- });
android:scheme用于指定数据的协议部分,如上列中的http部分
android:host用于指定数据的主机名部分,如上列中的www.baidu.com
android:port用于指定数据的端口不,一般紧随在主机名之后
android:path用于指定主机名和端口之后的部分,如一段网址中跟在域名之后的内容
android:mineType用于指定可以处理的数据类型,允许使用通配符的方式进行指定。
只有<data>标签中指定的内容和Intent中携带的Data完全一致时,当前活动才能够响应该Intent。
下面建立一个活动,让它也能响应打开网页的Intent。
新建一个布局文件名为third_layout.xml代码如下:
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:orientation="vertical" >
-
- <Button
- android:id="@+id/button_3"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="Button 3" />
-
- </LinearLayout>
- package com.wj.test;
-
- import android.app.Activity;
- import android.os.Bundle;
- import android.view.Window;
-
- public class ThirdActivity extends Activity {
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onCreate(savedInstanceState);
- requestWindowFeature(Window.FEATURE_NO_TITLE);
- setContentView(R.layout.third_layout);
- }
-
- }
注册activity
- <activity
- android:name=".ThirdActivity">
- <intent-filter >
- <action android:name="android.intent.action.VIEW"/>
- <category android:name="android.intent.category.DEFAULT"/>
- <data android:scheme="http"/>
- </intent-filter>
- </activity>
选择AndroidTest继续运行结果如下:
下面使用Intent实现调用拨打电话的功能
修改button1的监听程序,代码如下:
- button1.setOnClickListener(new OnClickListener(){
-
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- /* Toast.makeText(FirstActivity.this, "you clicked button1",
- Toast.LENGTH_SHORT).show();*/
- /*
- * Intent的使用分为显示的Intent和隐式的Intent,下面的是显示的Intent
- * Intent有多个构造函数,我使用的是一个简单的的,第一个参数Context要求提供一个启动
- * 活动的上下文,第二个参数Class则是指定想要启动的目标活动,通过这个构造函数构建出Intent
- * 的“意图”,然后使用startActivity(intent);启动目标活动。
- * Intent是android程序中个组件之间进行交互的一种重要的方式,它不紧可以指明当前组想要执行
- * 的动作,还可以在不同组件之间传递数据。Intent一般可被用于启动活动,服务,以及发送广播等。
- * */
- /*Intent intent=new Intent(FirstActivity.this,
- SecondActivity.class);
- startActivity(intent);*/
-
- //使用隐式的Intent
- /*Intent intent=new Intent("com.wj.test.activitytest.ACTION_START");
- intent.addCategory("com.wj.activitytest.MY_CATEGORY");
- startActivity(intent);*/
-
- //更多隐式的Intent的用法
- //打开浏览器
- /*
- * 这里我们指定了Intent的action是Intent.ACTION_VIEW,这是一个android系统内置的动作,
- * 其常量为android.intent.action.VIEW,然后通过Uri.parse方法,将一个网址字符串解析成一个
- * Uri对象,在调用Intent的setData()方法将这个对象传递进去。
- * */
- /*Intent intent=new Intent(Intent.ACTION_VIEW);
- intent.setData(Uri.parse("http://www.baidu.com"));
- startActivity(intent);*/
-
-
- //实现拨打电话
- Intent intent=new Intent(Intent.ACTION_DIAL);
- intent.setData(Uri.parse("tel:10086"));
- startActivity(intent);
-
-
-
- }
-
- });
下面我将讲解怎么使用Intent在活动中传递数据
向下一个活动传递数据
1.修改button1的监听按钮代码
- //向下一个活动传递数据
- /*
- * Intent中提供了一系列putExtra()方法的重载,可以把我们想要传递的数据暂存在Intent中
- * ,启动了另一个活动后,只需把这些数据再从Intent中取出就可以了。
- * */
- String data="Hello SecondActivity";
- Intent intent =new Intent(FirstActivity.this,SecondActivity.class);
- intent.putExtra("extra_data", data);
- startActivity(intent);
2.修改SecondActivity中将传递的数据取出,并打印出来,代码如下所示:
- package com.wj.test;
-
- import android.app.Activity;
- import android.content.Intent;
- import android.os.Bundle;
- import android.util.Log;
- import android.view.Window;
-
- public class SecondActivity extends Activity {
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onCreate(savedInstanceState);
- requestWindowFeature(Window.FEATURE_NO_TITLE);
- setContentView(R.layout.second_layout);
- Intent intent=getIntent();
- String data =intent.getStringExtra("extra_data");
- Log.d("SecondActivity", data);
- }
-
-
- }
通过getIntent()方法获取到用于启动SecondeActivity的Intent,然后调用<span style="font-family: Arial, Helvetica, sans-serif;">getStringExtra()方法,传入相应的键值,就可以得到传递的数据了。</span>
<span style="font-family:Arial, Helvetica, sans-serif;">运行程序可以看到如下输出Hello SecondActivity</span>
返回数据给上一个活动:
1.修改button1监听器的代码:
- button1.setOnClickListener(new OnClickListener(){
-
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- /* Toast.makeText(FirstActivity.this, "you clicked button1",
- Toast.LENGTH_SHORT).show();*/
- /*
- * Intent的使用分为显示的Intent和隐式的Intent,下面的是显示的Intent
- * Intent有多个构造函数,我使用的是一个简单的的,第一个参数Context要求提供一个启动
- * 活动的上下文,第二个参数Class则是指定想要启动的目标活动,通过这个构造函数构建出Intent
- * 的“意图”,然后使用startActivity(intent);启动目标活动。
- * Intent是android程序中个组件之间进行交互的一种重要的方式,它不紧可以指明当前组想要执行
- * 的动作,还可以在不同组件之间传递数据。Intent一般可被用于启动活动,服务,以及发送广播等。
- * */
- /*Intent intent=new Intent(FirstActivity.this,
- SecondActivity.class);
- startActivity(intent);*/
-
- //使用隐式的Intent
- /*Intent intent=new Intent("com.wj.test.activitytest.ACTION_START");
- intent.addCategory("com.wj.activitytest.MY_CATEGORY");
- startActivity(intent);*/
-
- //更多隐式的Intent的用法
- //打开浏览器
- /*
- * 这里我们指定了Intent的action是Intent.ACTION_VIEW,这是一个android系统内置的动作,
- * 其常量为android.intent.action.VIEW,然后通过Uri.parse方法,将一个网址字符串解析成一个
- * Uri对象,在调用Intent的setData()方法将这个对象传递进去。
- * */
- /*Intent intent=new Intent(Intent.ACTION_VIEW);
- intent.setData(Uri.parse("http://www.baidu.com"));
- startActivity(intent);*/
-
-
- //实现拨打电话
- /*Intent intent=new Intent(Intent.ACTION_DIAL);
- intent.setData(Uri.parse("tel:10086"));
- startActivity(intent);*/
-
-
- //向下一个活动传递数据
- /*
- * Intent中提供了一系列putExtra()方法的重载,可以把我们想要传递的数据暂存在Intent中
- * ,启动了另一个活动后,只需把这些数据再从Intent中取出就可以了。
- * */
- /*String data="Hello SecondActivity";
- Intent intent =new Intent(FirstActivity.this,SecondActivity.class);
- intent.putExtra("extra_data", data);
- startActivity(intent);*/
-
-
- //返回数据给上一个活动
- Intent intent=new Intent(FirstActivity.this,SecondActivity.class);
- /*
- * startActivityForResult方法接收2个参数,一个参数是Intent,第二个参数是请求码
- * ,用于在之后的的回调中判断数据的来源
- * */
- startActivityForResult(intent, 1);
-
-
-
- }
-
- });
2.给button2进行监听
- package com.wj.test;
-
- import android.app.Activity;
- import android.content.Intent;
- import android.os.Bundle;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.view.Window;
- import android.widget.Button;
-
- public class SecondActivity extends Activity {
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onCreate(savedInstanceState);
- requestWindowFeature(Window.FEATURE_NO_TITLE);
- setContentView(R.layout.second_layout);
- /*Intent intent=getIntent();
- String data =intent.getStringExtra("extra_data");
- Log.d("SecondActivity", data);*/
-
- //获得按钮组件
- Button button2=(Button) findViewById(R.id.button_2);
- button2.setOnClickListener(new OnClickListener(){//进行监听
-
- @Override
- public void onClick(View v) {
- // TODO Auto-generated method stub
- Intent intent=new Intent();
- intent.putExtra("data_return", "Hello FirstActivity");
- //setResult()方法接收两个参数,第一个参数用于向上一个活动返回处理结果,一般使用
- //RESULT_OK or RESULT_CANCELED,第二个参数则是把带有数据的Intent传递回去,然后调用
- //finish方法来销毁当前活动
- setResult(RESULT_OK,intent);
- finish();//销毁当前活动
- }
-
- });
-
- }
-
-
- }
3.重写FirstActivity的回调方法
- //重写onActivityResult方法获取返回的结果数据
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- // TODO Auto-generated method stub
- switch(requestCode){
- case 1:
- if(resultCode==RESULT_OK){
- String returnedData=data.getStringExtra("data_return");
- Log.d("FirstActivity", returnedData);
- }
- break;
- default:break;
- }
-
- }
运行程序点击button1,然后点击button2,观看log的输出你就会发现输出了
10-28 12:09:09.396: D/FirstActivity(3755): Hello FirstActivity
注意在一个活动中调用startActivityForResult方法去启动不同的活动,没一个活动返回的数据都会调用onActivityResult这个方法。
如果你不想点击button2的按钮进行返回,你可以点击back键进行返回只要重写SecondActivity的onBackPressed()方法就行了,代码如下:
- @Override
- public void onBackPressed() {
- // TODO Auto-generated method stub
- Intent intent=new Intent();
- intent.putExtra("data_return", "Hello FirstActivity");
- //setResult()方法接收两个参数,第一个参数用于向上一个活动返回处理结果,一般使用
- //RESULT_OK or RESULT_CANCELED,第二个参数则是把带有数据的Intent传递回去,然后调用
- //finish方法来销毁当前活动
- setResult(RESULT_OK,intent);
- finish();//销毁当前活动
- }
转载请注明:http://blog.csdn.net/j903829182/article/details/40502495
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。