Android学习——Intent

Intent的中文意思是“意图,意向”,在Android中提供了Intent机制来协助应用间的交互与通讯,Intent负责对应用中一次操作的动作、动作涉及数据、附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。Intent不仅可用于应用程序之间,也可用于应用程序内部的Activity/Service之间的交互。因此,可以将Intent理解为不同组件之间通信的“媒介”专门提供组件互相调用的相关信息。
本节主要介绍Intent如何实现两个Activity间的跳转,以及传递数据。
5.1 显式意图与隐式意图
activity_main.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="${relativePackage}.${activityClass}" >

    <ListView
        android:id="@+id/listView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        android:layout_above="@+id/button1"/>

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:onClick="add"
        android:text="添加" />

</RelativeLayout>

activity_reg.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="${relativePackage}.${activityClass}" >

    <EditText
        android:id="@+id/edt_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_marginTop="18dp"
        android:ems="10" 
        android:hint="请输入用户名">
        <requestFocus />
    </EditText>

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/edt_name"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="49dp"
        android:onClick="save"
        android:text="保存" />

</RelativeLayout>

MainActivity.java:

public class MainActivity extends Activity {
    private ListView listView;
    private ArrayAdapter<String> adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        listView = (ListView) this.findViewById(R.id.listView1);
        adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, UserDao.users);;
        listView.setAdapter(adapter);
    }

    public void add(View v) {
        Intent intent = new Intent(this,RegActivity.class);
        startActivity(intent);          
    }
}

RegActivity.java:

public class RegActivity extends Activity {
    private EditText edt_name;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_reg);
        edt_name = (EditText) this.findViewById(R.id.edt_name);
    }
    public void save(View v){
        UserDao.users.add(edt_name.getText().toString());
        this.finish();
    }
}

运行:
这里写图片描述
点击添加按钮,输入aaaaaa再点保存:
这里写图片描述
回到MainActivity查看,aaaaaa并没有显示在界面上。点击返回键,退出程序,再重新进入,发现aaaaaa已经显示出来了。
这里写图片描述
说明:static的数据不会随着程序的退出而消失,而是存在后台缓存中。可以在设置 - - >程序– >缓存进程中查看。因此不推荐写过多的static数据。
新添加的数据并没有立即显示在界面上,需要用otifyDataSetChanged方法。该方法的作用是当适配器的内容发生改变时强制重新加载Activity可以实现动态的刷新ListView的功能。

    @Override
    protected void onResume() {
        super.onResume();
        adapter.notifyDataSetChanged();
    }

区别:显式意图与隐式意图:
显示意图:可以看见跳转目标,只能跳到当前应用的Activity
隐式意图:不能看到跳转目标,可以跳到其他应用的Activity
显示意图:
Intent intent = new Intent(this,OneActivity.class);//同一个工程的Activity
隐式意图:
Intent intent = new Intent(“com.my.reg”);//其他工程中的RegActivity
在RegActivity所在工程的AndroidMainfest.xml配置文件的activity标签添加:




注意:有多个隐式意图一样的话,会让选择
注意:该工程要重新发布一下,要不然运行时会报错。
5.2 传递数据
一个Activity放String数据:

        Intent intent = new Intent(this,OneActivity.class);
        intent.putExtra("name", "xxxx");//放数据
        startActivity(intent);

另一个Activity取数据:

        Intent intent = this.getIntent();
        String name = intent.getStringExtra("name");
        Toast.makeText(this, name, 0).show();

5.1中传递数据也可以按照如下写法:

//RegActivity.java: 
public void save(View v){
        UserDao.users.add(edt_name.getText().toString());       
        Intent intent = this.getIntent();
        //存放要返回的数据
        intent.putExtra("name", edt_name.getText().toString());
        //返回结果
        this.setResult(1000, intent);
        this.finish();
    }
//MainActivity.java:
    public void add(View v) {
        Intent intent = new Intent(this,RegActivity.class);
        //跳转到一个指定的Activity,并要返回结果
        this.startActivityForResult(intent, 1);
}
    //拿返回的结果
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        //唤醒适配器,强制刷新界面
        adapter.notifyDataSetChanged();

    }

Intent对象创建的三种方式:
(1)构造方法
(2)setComponent
(3)setClassName

5.3 Intent的Category属性
主要介绍以下三种:
LANCHER:使用这个种类来让一个 Activity 作为应用程序的启动项。
DEFAULT:表示让组件成为 Intent Filter 中定义的 data 的默认动作。这对使用显式 Intent 启动的 Activity 来说也是必要的。
HOME:表示放回到Home界面

5.4 action属性
(1)Activity2有两个action属性,那么通过”www.aa.com”或者”www.bb.com”都可以跳转到Activity2。
(2)Activity2和Activity3的action属性相同,都是”www.bb.com”,在实际跳转的时候会让选择跳转到哪个Activity。如下图:
这里写图片描述
AndroidMainfest.xml文件配置内容:

        <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=".Activity2"
            android:label="@string/title_activity_other" >
            <intent-filter>
                <action android:name="www.aa.com" />
                <action android:name="www.bb.com" />                
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>
        <activity
            android:name=".Activity3"
            android:label="@string/title_activity_activity3" >
            <intent-filter>
                <action android:name="www.bb.com" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>

如果给Activity3添加一个data属性,则Activity2和Activity3就可以区分开。如:

如果再新建一个Activity4,属性如下:

        <activity
            android:name=".Activity4"
            android:label="@string/title_activity_activity4" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

那么则会创建两个桌面图标,通过桌面上的Activity4图标也可以访问。
这里写图片描述

5.5 intent的Flag属性:
在 android.content.Intent 中一共定义了20种不同的 flag,其中和 Task 紧密关联的有四种:
FLAG_ACTIVITY_CLEAR_TOP:清除栈顶,和singleTop类似
FLAG_ACTIVITY_NO_HISTORY: 没有历史记录
FLAG_ACTIVITY_NEW_TASK: 与taskAffinity配合使用
FLAG_ACTIVITY_SINGLE_TOP:与singleTask类似
使用方式:intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

5.6 系统action

    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);
        Intent intent = new Intent();
        Uri uri = null;
        String data=null;
        switch (position) {
        case 0:
            //查看第一个位置的联系人
            data = "content://contacts/people/1";
            uri = Uri.parse(data);
            intent.setAction(Intent.ACTION_VIEW);
            intent.setData(uri);
            startActivity(intent);
            break;
        case 1:
            //编辑第一个位置的联系人
            data = "content://contacts/people/1";
            uri = Uri.parse(data);
            intent.setAction(Intent.ACTION_EDIT);
            intent.setData(uri);
            startActivity(intent);
            break;
        case 2:
            //跳转到拨号界面
            data = "tel:15133220000";
            uri = Uri.parse(data);
            intent.setAction(Intent.ACTION_DIAL);
            intent.setData(uri);
            startActivity(intent);
            break;
        case 3:
            //直接打电话
            data = "tel:15133220000";
            uri = Uri.parse(data);
            intent.setAction(Intent.ACTION_CALL);
            intent.setData(uri);
            startActivity(intent);
            break;
        case 4:
            //用浏览器访问百度首页
            data = "http://www.baidu.com";
            uri = Uri.parse(data);
            intent.setAction(Intent.ACTION_VIEW);
            intent.setData(uri);
            startActivity(intent);
            break;

        default:
            break;
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值