Intent在活动的操作
作用:
Itent是Android程序中各个组件直接交换的一个重要方式可以指定当前组件要执行任务同时也可以给各个组件直接进行数据交互
同时Intent启动往往可以启动活动,启动服务,以及发送广播等场景
分类
1.显示Intent和隐示Intent
显示Intent操作
1.首先我们新建一个Android工程
在分别讲解显示意图和隐示意图时我们要在rec目录 -layout资源新建活动 。
然后右键点击新建一个activity_second.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/button2" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Button2" /> </LinearLayout>
2.新建一个活动
在我们添加完按钮组件之后同时给按钮取个名字叫button2和唯一id名,然后在src 目录工程包下新建一个活动SecondActivity继承Activity类让其成为活动类
然后重写onCreate()方法,同时给该活动设置上下文布局文件
package com.example.intentdome; import android.app.Activity; import android.os.Bundle; public class SecondActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second);//读取我们刚才在layout资源文件新建的布局文件 } }
3.然后在AndroidManifest.xml工程配置文件中注册一个活动
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.intentdome" 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=".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 android:name=".SecondActivity" > </activity> </application> </manifest>
以上步骤已经操作完毕,那我们开始下一步操作
给按钮绑定事件
1.给定MainActivit视图文件绑定一个点击事件
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //获取按钮对象 Button btn1 = (Button)findViewById(R.id.button1); //给该按钮绑定一个监听事件 btn1.setOnClickListener(new OnClickListener() { @Override //当鼠标点击操作事着触发该操作 public void onClick(View v) { } }); }
2.创建意图对象
Intent的构 该类有多个构造函数其中一个Intent(Context packageCntext,Class<?> cls) 第一个参数:指定要启动的上下文 第二个参数:指定要启动的目标活动
//获取一个意图对象
Intent intent = new Intent(MainActivity.this,SecondActivity.class);
3.实现活动启动之间的交互
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //获取按钮对象 Button btn1 = (Button)findViewById(R.id.button1); //给该按钮绑定一个监听事件 btn1.setOnClickListener(new OnClickListener() { @Override //当鼠标点击操作事着触发该操作 public void onClick(View v) { //获取一个意图对象 //实现活动与活动直接的交互 Intent intent = new Intent(MainActivity.this,SecondActivity.class); //调用启动活动操作 startActivity(intent); } }); }
隐示Intent操作
特点:隐示它并不明确表面指出我们要启动那个活动,而是抽象的指定一系列action和category等信息
1.实现隐示操作:打开AndroidManifest.xml文件重新编写activity的内容
<application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <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 android:name=".SecondActivity"> <intent-filter > <action android:name="com.example.intentdome.ACTION_START"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> </activity> </application>
2.重新编写MainActivity.java的按钮点击事件
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //获取按钮对象 Button btn1 = (Button)findViewById(R.id.button1); //给该按钮绑定一个监听事件 btn1.setOnClickListener(new OnClickListener() { @Override //当鼠标点击操作事着触发该操作 public void onClick(View v) { /* //获取一个意图对象 //实现活动与活动直接的交互 Intent intent = new Intent(MainActivity.this,SecondActivity.class); //调用启动活动操作 startActivity(intent);*/ Intent intent = new Intent("com.example.intentdome.ACTION_START"); startActivity(intent); } }); }
3.运行:输出同样的结果
使用隐示启动其他程序内部活动
其实隐示不仅仅可以启动自己程序的活动,还可以启动其他程序的活动,使得Android多个应用共享成为了可以,这样程序与程序直接进行数据交换,这样就不用我们而外编写其他程序活动来操作了
以下一个案例展示通过自己本程序去调用系统的浏览器来打开一个博客的网页操作
1.重新编写MainActivity.java按钮点击事件
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //获取按钮对象 Button btn1 = (Button)findViewById(R.id.button1); //给该按钮绑定一个监听事件 btn1.setOnClickListener(new OnClickListener() { @Override //当鼠标点击操作事着触发该操作 public void onClick(View v) { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse("http://www.cnblogs.com/xiaotaojing/")); startActivity(intent); } }); }
以上是Intent中通过Intent来启动一个活动操作,其实Intent会可以活动与活动直接进行数据交互和传递,那然我们来看看是怎么样的一个过程吧
Intent实现活动中数据的传递
设置数据
Intetn提供了一个putExtra()方法用于以键-值对的形式进行数据的存放,相当与Serlet的作用域对象setAttibute()方法,puExtra()方法提供了方法重载,将传递的数据暂存在Intent中
启动一个活动到另一个活动时,只需要在重Intent中获取数据即可
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //获取按钮对象 Button btn1 = (Button)findViewById(R.id.button1); //给该按钮绑定一个监听事件 btn1.setOnClickListener(new OnClickListener() { @Override //当鼠标点击操作事着触发该操作 public void onClick(View v) { Intent intent = new Intent(MainActivity.this,SecondActivity.class); intent.putExtra("data", "Hello SecondActivity"); startActivity(intent); } }); }
获取数据
可以通过getStringExtra()方法获取存放的数据
Intent.getStringExtra(设值的参数名)
然后在ScondActivity.java中编写如下代码
package com.example.intentdome; import android.app.Activity; import android.os.Bundle; import android.widget.Toast; public class SecondActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); //通过提示框来显示数据 Toast.makeText(this, getIntent().getStringExtra("data"), Toast.LENGTH_SHORT).show(); } }
运行测试
携带数据返回上一个活动
既然讲到了一个活动可以给下一个活动传递数据,那可以返回数据为上一个活动呢? 其实是可以的,当你点返回键时不是可以返回上一个活动了吗?哈哈,那只是返回并没有携带数据一起返回
怎样做才可以重一个活动返回上一个活动呢?还可以携带数据,其实我们需要用到一个方法就是startActivityForResulte() 其中该方法有两个参数
第一个参数 :Intent对象、第二个参数:请求的结果码.
btn1.setOnClickListener(new OnClickListener() { @Override //当鼠标点击操作事着触发该操作 public void onClick(View v) { Intent intent = new Intent(MainActivity.this,SecondActivity.class); startActivityForResult(intent, 1); } });
第二在SecondActivity.java中编写如下代码
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); Button btn2 = (Button)findViewById(R.id.button2); btn2.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { Intent intent = new Intent(); //设置要返回的值 intent.putExtra("data_return", "我已经返回上一个活动了"); //设置返回结果 setResult(RESULT_OK, intent); finish();//销毁前执行 } });
由于我们设置了starActivityForReturn()方法来启动SecondActivity,在SecondActivity被销毁之后会调用一个活动的onActivityResult()方法,所以我要在MainActivity.java中重写
onActivityResult()方法
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); switch (requestCode) { case 1: if(resultCode==RESULT_OK){ Toast.makeText(this, data.getStringExtra("data_return"),Toast.LENGTH_SHORT).show() ; } break; default: break; } }
3.测试
成功执行
是不是这次讲解的知识点很强大呢?哈哈,这已经实现了像网站中页面与页面之间跳转同时携带数据的效果