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的基本的一些用法就先说到这里,有什么问题,请指正。

  • 相关阅读:
    Codeforces Round #649 (Div. 2) D. Ehab's Last Corollary
    Educational Codeforces Round 89 (Rated for Div. 2) E. Two Arrays
    Educational Codeforces Round 89 (Rated for Div. 2) D. Two Divisors
    Codeforces Round #647 (Div. 2) E. Johnny and Grandmaster
    Codeforces Round #647 (Div. 2) F. Johnny and Megan's Necklace
    Codeforces Round #648 (Div. 2) G. Secure Password
    Codeforces Round #646 (Div. 2) F. Rotating Substrings
    C++STL常见用法
    各类学习慕课(不定期更新
    高阶等差数列
  • 原文地址:https://www.cnblogs.com/yuqf/p/5490304.html
Copyright © 2011-2022 走看看