zoukankan      html  css  js  c++  java
  • Android开发学习之路--Activity之Intent

        窗外再次飘起了小雪,还有1周就过年了,2016年即将到来,来年不知道自己将身处何处,船到桥头自然直吧。还是继续学习吧,上次学习了Activity,那么如果是两个Activity之间,怎么从一个Activity切换到另外一个Activity呢?那便是Intent,intent中文的意思就是意图,目的的意思。也就是从个一个Activity到另一个Activity了。下面就来个例子比较直观吧。

        接着上次的学习,首先再新建一个Activity:


        新建Activity,命名为SecondActivity并自动生成layout为activity_second:


        然后添加一个Button,命名为Button2,如下图所示:


        修改代码去处标题栏:

    package com.example.jared.activitystudy;
    
    import android.support.v7.app.ActionBar;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    
    public class SecondActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            ActionBar actionBar = getSupportActionBar();
            actionBar.hide();
            setContentView(R.layout.activity_second);
        }
    }
    
         在AndroidManifest.xml中添加Activity,其实在创建空的Activity的时候,软件已经为我们添加了。

    <activity android:name=".SecondActivity"></activity>
    
        Intent的方式有两种,一种是显式的方式,一种是隐式的方式,先看下显式的方式。这里看下Intent的官方文档就有说明,构造函数Intent,其中packageContext是提供一个启动活动的上下文,cls是要启动的活动的class。

    public Intent (Context packageContext, Class<?> cls)

        然后通过startActivity()方法来启动一个活动,
    参数是一个Intent,说了这些听着也不明白,还是来个例子明白。
        就像一般App,点击了按钮或者链接来启动新的一个Activity,FirstActivity中正好有一个button,所以就监听button的事件来触发。代码如下所示:
    package com.example.jared.activitystudy;
    
    import android.content.Intent;
    import android.support.v7.app.ActionBar;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.Toast;
    
    public class FirstActivity extends AppCompatActivity {
    
        private Button button;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            ActionBar actionBar = getSupportActionBar();
            actionBar.hide();
            setContentView(R.layout.activity_first);
    
            button = (Button)findViewById(R.id.button1);
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Toast.makeText(FirstActivity.this, "Button1 is clicked!!",
                            Toast.LENGTH_SHORT).show();
                    Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
                    startActivity(intent);
                }
            });
        }
    }
        这里先定义了Button,然后通过findViewById来指定button1,然后调用setOnClickListener来监听这个button的事件。其中的Toast主要是用来显示一下小通知给用户的。
        运行,并且按button1显示如下
                 
        Intent的功能就很好的体现出来了,这个就是显式Intent了,意图非常的明显。而隐式Intent指定了一系列更为抽象的action和category等信息,然后交由系统自己去分析这个Intent,并帮我们找出合适的Activity去启动。
        通过<activity>标签下配置<intent-filter>的内容,可以指定当前活动能够响应的action和category,action表示的是普通的将被执行的行动,例如ACTION_VIEW,ACTION_EDIT,ACTION_MAIN等。category表示为之心的行动提供额外的信息。然后在AndroidManifest.xml中添加代码如下:
    <activity android:name=".SecondActivity">
        <intent-filter>
            <action android:name="com.example.jared.activitystudy.ACTION_START" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent
        然后在FirstActivity代码中添加如下:
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Toast.makeText(FirstActivity.this, "Button1 is clicked!!",
                    Toast.LENGTH_SHORT).show();
    
            //Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
            Intent intent = new Intent("com.example.jared.activitystudy.ACTION_START");
            startActivity(intent);
        }
    });
        如上Intent传入了这个action,然后在AndroidManifest中也添加了同样的action,而category是DEFAULT的,所以这样就实现了Intent的功能。如果定义自己的category,那么修改代码如下:
    <activity android:name=".SecondActivity">
        <intent-filter>
            <action android:name="com.example.jared.activitystudy.ACTION_START" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="com.example.jared.activitystudy.MY_CATEGORY"/>
        </intent-filter>
    </activity>
        FirstActivity代码如下:
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Toast.makeText(FirstActivity.this, "Button1 is clicked!!",
                    Toast.LENGTH_SHORT).show();
    
            //Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
            Intent intent = new Intent("com.example.jared.activitystudy.ACTION_START");
            intent.addCategory("com.example.jared.activitystudy.MY_CATEGORY");
            startActivity(intent);
        }
    });
        运行代码如上面的显式的方式一样的效果,这里就不再添图了。
        关于Intent,还有很多的隐式用法,使用Intent不仅仅可以启动我们自己想要启动的Activity,还可以启动其他程序的Activity,这样就使得多个Android应用程序之间的功能得到共享。比如我想要在应用中显示一个网页,调用内部的浏览器就可以了。
        先来实现下,修改FirstActivity代码如下:
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Toast.makeText(FirstActivity.this, "Button1 is clicked!!",
                    Toast.LENGTH_SHORT).show();
    
            Intent intent = new Intent("Intent.ACTION_VIEW");
            intent.setData(Uri.parse("http://blog.csdn.net/eastmoon502136"));
            startActivity(intent);
        }
    });
        这里的ACTION_VIEW是android系统的内置动作。Uri.parse()的方法,将网址字符串解析成一个Uri对象,再调用Intent的setData()方法将这个对象传递进去。然后运行程序,点击button显示如下:

        此外如果我们想要调用系统拨号的界面,那么就需要用到Intent.ACTION_DIAL了,修改代码如下:
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Toast.makeText(FirstActivity.this, "Button1 is clicked!!",
                    Toast.LENGTH_SHORT).show();
    
            Intent intent = new Intent(Intent.ACTION_DIAL);
            intent.setData(Uri.parse("tel:10086"));
            startActivity(intent);
        }
    });
         运行后,点击button按钮显示如下:


        关于隐式的Intent就介绍到这里了,其他的可以参考android官方的文档。

        比如我第一个Activity里面填写了一些信息,要在另一个Activity中用到,那么怎么才能把信息从第一个Activity传递到第二个Activity中呢?当然这里还是需要用到Intent了。

        这里还是以例子来得实际吧,依然继承上面的代码,这里用putExta方法来实现。首先在FirstActivity中添加代码:

    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Toast.makeText(FirstActivity.this, "Button1 is clicked!!",
                    Toast.LENGTH_SHORT).show();
            String data = "I am from FirstActivity";
            String name = "exta_data";
            Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
            intent.putExtra(name, data);
            startActivity(intent);
        }
    });
        这里的putExta需要两个参数,一个是名字,一个是数据。这里名字定义为:exta_data,数据就根据需求了。好了既然这个FirstActivity代码已经写完了,那么接收端SecondActivity就需要处理数据了。为了能在SecondActivity中显示,顾这里在activity_second.xml中添加一个textview(之后添加控件就不多做说明了):

        

        添加完后我们再回到SecondActivity中来编写接收到的数据并显示的代码:

    public class SecondActivity extends AppCompatActivity {
        private TextView textview;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            ActionBar actionBar = getSupportActionBar();
            actionBar.hide();
            setContentView(R.layout.activity_second);
    
            String name = "exta_data";
            Intent intent = getIntent();
            String data = intent.getStringExtra(name);
            textview = (TextView)findViewById(R.id.exta_data);
            textview.setText(data);
        }
    }
        这里定义了TextView,通过findViewById来获取exta_data这个textview,然后通过intent的getStringExta(如果传入的是int类型,那么就用getIntExta方法,其他类似)来获取传递过来的数据,通过textview的setText来显示接收到的数据,运行结果如下:


        那么如果按了back按键,SecondActivity的数据能传递回给FirstActivity呢?答案是肯定的。那么我们还是来测试下吧:

        首先也为FirstActivity添加个textview:


        这里和SecondActivity的类似,然后修改SecondActivity代码:

    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            String name = "return_data";
            String data = "I am from SecondActivity";
            Intent intent1 = new Intent();
            intent1.putExtra(name, data);
            setResult(RESULT_OK, intent1);
            finish();
        }
    });
        这里实例化一个intent1,传入name为return_data,数据自定义。然后通过setResult方法来回调给FirstActivity,这里调用finish主要是为了销毁SecondActivity使FirstActivity在栈顶,其中RESULT_OK是返回值,还有RESULT_CANCELED。

        接着就是修改FirstActivity的代码了。替换startActivity方法如下,这个方法是有返回值,并且能在onActivityResult方法中回调的。

    startActivityForResult(intent, 1);
    
        然后就是在onActivityResult方法中实现了:

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode) {
            case 1:
                if(resultCode == RESULT_OK) {
                    String name = "return_data";
                    String returnData = data.getStringExtra(name);
                    textView = (TextView)findViewById(R.id.return_data);
                    textView.setText(returnData);
                }
                break;
            default:
        }
    }
        其中的名字和SecondActivity对应,运行显示如下:


        好了,关于Intent差不多就学习到这里了。

  • 相关阅读:
    直线的中点Bresenham算法的实现
    使用git 将自己的本地文件git到github上面的完整过程
    利用Microsoft VC++6.0 的MFC 的绘图工具实现简单图形的绘制
    github常见操作和常见错误及其解决办法
    浅谈软件配置管理工具(github & SVN)
    为Github 托管项目的访问添加SSH keys
    jQuery:用 lightTreeview 实现树形分类菜单的功能 展开收缩分类代码
    程序设计7大面向对象设计原则
    计算机组成原理实验之模拟整机实验考核试题
    计算机组成原理实验之CPU组成与指令周期实验
  • 原文地址:https://www.cnblogs.com/wuyida/p/6299972.html
Copyright © 2011-2022 走看看