zoukankan      html  css  js  c++  java
  • Android基础学习第三篇—Intent的用法

    写在前面的话:

    1. 最近在自学Android,也是边看书边写一些Demo,由于知识点越来越多,脑子越来越记不清楚,所以打算写成读书笔记,供以后查看,也算是把自己学到所理解的东西写出来,献丑,如有不对的地方,希望大家给与指正。

    2. 由于类似于读书笔记,可能格式神马的会比较随(hen)意(chou),大家看着受不了,可以使劲吐槽。

    *************************************我只是分割线***************************************

    上一篇已经讲了一些关于Activity的东西,这次记录一下android中比较重要的一个类Intent。

    1. 什么是Intent?

    Intent是Android程序中各组件之间进行交互的一种重要方式,它一般可被用于启动活动、启动服务、以及发送广播等场景,这一篇主要讲述在活动启动过程中Intent的用法,它的用法大致分为两种情况:显式Intent和隐式Intent。

    2. 显示Intent用法

    就像上一篇讲的关于活动的启动、活动间的传值其实都是显式Intent的用法,

    <2.1>页面普通跳转

    Intent _intent = new Intent();
    _intent.setClass(MainActivity.this, TestActivity.class);
    startActivity(_intent);

    上面表示的是从活动MainActivity跳转到活动TestActivity,不传递任何数据。

    <2.2>页面跳转,并返回值

    在MainActivity活动中,按钮点击中添加如下代码:

    Intent _intent = new Intent();
    _intent.setClass(MainActivity.this, ActivityC.class);
    startActivityForResult(_intent, 100);

    在ActivityC活动中,把数据传递回去:

        class ButtonActivityAListener implements OnClickListener {
    
            @Override
            public void onClick(View v) {
                if (v.getId() == R.id.btnreturn) {
                    Intent _intent = new Intent();
                    EditText editText = (EditText) findViewById(R.id.edittext_first);
                    String inputStr = editText.getText().toString();
                    _intent.putExtra("dashenzaijia", inputStr);
                    setResult(Activity.RESULT_OK, _intent);
                    finish();
                }
            }
        }
    //可能还有一种情况,如果用户不是点击按钮返回的上一个活动,而是点击的手机的Back按钮,这时候只要重写onBackPressed方法就好了,如下
    @Override
    public void onBackPressed() {
    Intent _intent = new Intent();
    _intent.putExtra("dashenzaijia", "need transfer value");
    setResult(Activity.RESULT_OK, _intent);
    finish();
    }

    在MainActivity活动的onActivityResult方法中,获取对应的返回值:

        @Override
        protected void onActivityResult(int arg0, int arg1, Intent arg2) {
            // TODO Auto-generated method stub
            super.onActivityResult(arg0, arg1, arg2);
            if (arg0 == 100 && arg1 == Activity.RESULT_OK) {
                String returnValue = arg2.getStringExtra("dashenzaijia");
                TextView view = (TextView) this.findViewById(R.id.textview_showresult);
                if (!returnValue.isEmpty()) {
                    view.setText("来自Activity C的值:" + returnValue);
                } else {
                    view.setText(null);
                }
            }
        }

    请注意参数中100,还有Activity.RESULT_OK,它们是两个页面传值的暗号,只有对上了暗号,才能去获取对应活动传回来的值。

    <2.3>把值传递给下一个活动

    在MainActivity活动的跳转按钮中,实现如下代码:

        Intent _intent = new Intent();
        _intent.setClass(MainActivity.this, TestActivity.class);
        _intent.putExtra("transfertockey", "give current value to activity c");
        startActivity(_intent);

    在TestActivity活动中的onCreate(Bundle savedInstanceState)方法获取:

       Intent intent = getIntent();
       String value = intent.getStringExtra("transfertockey");
       Log.i("onCreate", value);

     3. 隐式Intent用法

    <3.1.1>显示一个新的活动:如上面2.1说的,我们在显示一个新的活动的时候,可以传那个新的活动的类名,也可以用如下方法,

    在AndroidManifest.xml文件中,为CanvasActivity活动添加配置,自定义一个Action,并加上默认的Category:

            <activity android:name=".CanvasActivity">
                <intent-filter>
                    <action android:name="firstapp.canvasactivity.firstaction" />
                    <category android:name="android.intent.category.DEFAULT" />
                </intent-filter>        
            </activity>

    然后再MainActivity活动中,调用方法如下:

        class NotificationClickListener implements OnClickListener {
            @Override
            public void onClick(View v) {
                if (v.getId() == R.id.btnshownotification) {
                    Intent intent = new Intent("firstapp.canvasactivity.firstaction");
                    startActivity(intent);
                }
            }
        }

    备注:<category android:name="android.intent.category.DEFAULT" />这一句话一定不能少,不然会报错的。

    <3.1.2>显示一个新的活动,在3.1.1基础上,我们也可以自定义一个Category,

            <activity android:name=".CanvasActivity">
                <intent-filter>
                    <action android:name="firstapp.canvasactivity.firstaction" />
                    <category android:name="android.intent.category.DEFAULT" />
                    <category android:name="firstapp.canvasactivity.firstcategory" />
                </intent-filter>
            </activity>

    调用和3.1.1差不多,只是多了一句:

        class NotificationClickListener implements OnClickListener {
            @Override
            public void onClick(View v) {
                if (v.getId() == R.id.btnshownotification) {
                    Intent intent = new Intent("firstapp.canvasactivity.firstaction");
                    intent.addCategory("firstapp.canvasactivity.firstcategory");
                    startActivity(intent);
                }
            }
        }    

    <3.2.1>显示一个网页,在ActivityB活动中,点击按钮代码,即可打开浏览器:

    ActivityB在AndroidManifest.xml文件中的配置是:

            <activity
                android:name=".ActivityB"
                android:label="@string/title_activity_b">
            </activity>

     调用如下:

            Button btnOpenWeb = (Button)findViewById(R.id.btnopenweb);
            btnOpenWeb.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(Intent.ACTION_VIEW);
                    intent.setData(Uri.parse("http://www.baidu.com"));
                    startActivity(intent);
                }
            });

    备注:一定要在网址前面添加http://,不然会报错的,系统不知道www.baidu.com是什么,应该用什么打开。

    <3.2.2>显示一个网页,网页打开的代码和上面一样,唯一不同的是在AndroidManifest.xml中,我们在ActivityB活动的配置中加上几行代码:

            <activity
                android:name=".ActivityB"
                android:label="@string/title_activity_b">
                <intent-filter>
                    <action android:name="android.intent.action.VIEW" />
                    <category android:name="android.intent.category.DEFAULT" />
    
                    <data android:scheme="http" />
                </intent-filter>
            </activity>

    运行代码,你会发现,我们的ActivityB也变成了打开网页的应用的一个选项。

    <3.3>调用地图,显示位置

            Button btnOpenWeb = (Button)findViewById(R.id.btnopenweb);
            btnOpenWeb.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(Intent.ACTION_VIEW);
                    intent.setData(Uri.parse("geo:114.06667,22.61667?q=高新园地铁站"));
                }
            });

    和3.2.2一样,如果在AndroidManifest.xml的ActivityB中加上一句<data android:scheme="geo" />,ActivityB也变成了能够打开这个地理位置的列表中选项之一。

    <3.4>调用系统拨号

            Button btnOpenWeb = (Button)findViewById(R.id.btnopenweb);
            btnOpenWeb.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent intent = new Intent(Intent.ACTION_VIEW);
                    intent.setData(Uri.parse("tel:15811588511"));
                    startActivity(intent);
                }
            });

    好了,Intent的基本的一些用法就先说到这里,有什么问题,请指正。

  • 相关阅读:
    引领云原生2.0,华为云加速云原生全行业落地!
    【STM32H7】第22章 ThreadX GUIX窗口图标滑动操作实现方法
    【STM32F429】第21章 ThreadX GUIX窗口图标滑动操作实现方法
    【STM32H7】第21章 ThreadX GUIX外置主题,字库和图库到外部SPI Flash
    【STM32F429】第20章 ThreadX GUIX外置主题,字库和图库到外部SPI Flash
    【STM32H7】第20章 ThreadX GUIX汉字显示(QSPI Flash全字库)
    【STM32H7】第19章 ThreadX GUIX的OLED单色屏移植
    【STM32F429】第19章 ThreadX GUIX的OLED单色屏移植
    第28届全球超顶级PCB设计PK结果公布,含炫酷PCB设计效果展示(2020-12-28)
    H7-TOOL固件升级至V1.45,增加上位机截图功能(2020-12-27)
  • 原文地址:https://www.cnblogs.com/yuqf/p/5490304.html
Copyright © 2011-2022 走看看