Android开发1:活动的基本用法

本文详细介绍了Android开发中活动(Activity)的基本用法,包括创建活动、使用Toast、Menu以及Intent的应用。通过实例展示了如何启动活动、传递数据、使用显式和隐式Intent,以及如何在活动中响应用户操作。此外,还探讨了Intent在启动其他应用组件和服务中的作用。
摘要由CSDN通过智能技术生成

Android开发:活动的基本用法

#以下所有学习内容参考郭霖编写的《Android第一行代码》
按照书上的进度进行学习,该贴只是记录本人学习的笔记。

alt+insert可以弹出generate

一、创建一个活动

首先创建一个项目选择Add No Activity,我把它命名为ActivityTest。
然后在app/src/main/java/com.example.activitytest下创建一个Empty Activity,命名为FirstActivity。
在这里插入图片描述
然后创建布局,在app/src/main/res下创建layout目录在创建一个Layout resource file 命名为first_layout。
在这里插入图片描述
在first_layout.xml里添加一个button:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/button_1"  
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Button 1"
        />
</LinearLayout>

在活动中加载布局:

public class FirstActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        //加载first_layout布局
        setContentView(R.layout.first_layout);


    }
}

并在AndroidManifest.xml中注册并配置主活动:

		//注册
        <activity android:name=".FirstActivity" android:label="This is FirstActivity">
            //配置主活动
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>

运行效果
在这里插入图片描述

二、在活动中使用Toast(短小信息通知)

为按钮增加一个toast
在onCreate()中添加:

        //点击按钮弹出一个Toast
        //把View对象转换成Button对象
        Button button1=(Button)findViewById(R.id.button_1);
        //为按钮注册监听器,当按下按钮时执行onClick方法
        button1.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                Toast.makeText(FirstActivity.this,"You click on button 1",Toast.LENGTH_SHORT).show();
            }
        });

效果如图:
在这里插入图片描述

三、在活动中使用Menu

res下创建menu,再创建main:
在这里插入图片描述
在main.xml中创建两个菜单项:

<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/add_item"
        android:title="Add"/>
    <item
        android:id="@+id/remove_item"
        android:title="Remove"/>
</menu>

在FirstActivity中重写onCreateOptionsMenu:
#小技巧:ctrl+Ok可以弹出override

    @Override
    //创建活动菜单
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main,menu);
        return true;
    }

定义菜单响应事件:在FirstActivity中重写onOptionsItemSelected

    @Override
    //定义菜单响应事件
    public boolean onOptionsItemSelected(MenuItem item) {
        switch(item.getItemId()){
            case R.id.add_item:
                Toast.makeText(this,"you clicked Add",Toast.LENGTH_SHORT).show();
                break;
            case R.id.remove_item:
                Toast.makeText(this,"you clicked Remove",Toast.LENGTH_SHORT).show();
                break;
            default:
        }
        return true;
    }

效果:
在这里插入图片描述
在这里插入图片描述
销毁一个活动:

      public void onClick(View v){
                finish();
            }

四、Intent的应用

Intent是Android程序中各组件之间进行交互的一种重要方式,它不仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递数据。Intent一般用于启动活动、启动服务和发送广播等场景。
Intent大致可以分为两种:显式Intent和隐式Intent。

1.显式Intent用于启动活动:

首先和创建FirstActivity一样创建一个新的活动SecondActivity,同样是有一个按钮,我们要求在按下button1 后跳到SecondAcitivity去。
在FirstActivity的onClick中写:

            public void onClick(View v){
                //Intent构造函数重载
                //第一个参数:提供一个启动活动的上下文(Content)
                //第二个参数:想要启动的目标活动(Class)
                Intent intent =new Intent(FirstActivity.this, SecondActivity.class);
                //启动活动
                startActivity(intent);

            }

按下button 1:
在这里插入图片描述

2.隐式Intent启动活动

隐式Intent并不明确指出我们想要哪一个活动,而是指定了一系列更为抽象的action和category等信息,然后交由系统去分析这个Intent,并帮我们找出合适的活动去启动。

指定SecondActivity的action和category:

        <activity android:name=".SecondActivity">
            <intent-filter>
                //指定当前活动能够响应的action和category
                <action android:name="com.example.activitytest.ACTION_START" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="com.example.activitytest.MY_CATEGORY" />
            </intent-filter>
        </activity>

只有和中的内容同时能够匹配上Intent中指定的action和category时,这个活动才能够响应该Intent。

修改FirstActivity中的点击事件:

        button1.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                //Intent另外一个构造函数
                //每个Intent只能指定一个action,但可以指定多个category
                Intent intent =new Intent("com.example.activitytest.ACTION_START");
                //增加category
                intent.addCategory("com.example.activitytest.MY_CATEGORY");
                //启动活动
                startActivity(intent);

            }
        });

这时候点击button 1 就会跳到SecondActivity这个活动了。

3.更多隐式Intent的用法

使用隐式Intent,我们不仅可以启动自己程序内的活动,还可以启动其他程序的活动。
例如:修改FirstActivity中的点击事件:

            @Override
            public void onClick(View v){
                //Intent.ACTION_VIEW是系统内置的动作,其常量值为android.intent.action.VIEW
                Intent intent =new Intent(Intent.ACTION_VIEW);
                //把一个字符串解析成Uri对象,再传进setData()中。
                intent.setData(Uri.parse("http://www.baidu.com"));
                //启动活动
                startActivity(intent);

            }

运行,点击button 1 后
在这里插入图片描述

选择浏览器:
在这里插入图片描述
扩展:我们还可以在标签中再配置一个标签,用于更精确的指定当前活动能够响应什么类型的数据。标签主要可以配置以下内容:

android:scheme: 用于指定数据的协议部分,例如http
android:host: 用于指定数据的主机名部分,例如www.baidu.com
android:port: 用于指定数据的端口部分,一般紧随在主机名后
android:path: 用于指定主机名和端口之后的部分,如一段网址中跟在域名之后的内容
android:mimeType: 用于指定可以处理的数据类型,允许使用通配符的方式进行指定

只有标签中指定的内容和Intent中携带的Data完全一样时,当前活动才能够响应该Intent。

例如:
和FirstActivity和SecondActivity一样创建一个新的活动ThirdActivity。
修改ThirdActivity中的注册信息:

        <activity android:name=".ThirdActivity">
            <intent-filter>
                <action android:name="android.intent.action.VIEW"/>
                <category android:name="android.intent.category.DEFAULT"/>
                <data android:scheme="http"/>
            </intent-filter>
        </activity>

运行:
在这里插入图片描述
点击ActivityTest:
在这里插入图片描述
要注意,这里的ThirdActivity并没有执行加载网页的功能。

除了http协议之外,我们还可以指定很多其他的协议,比如geo表示显示地理位置、tel表示拨打电话。举例:在程序中调用系统拨号页面:
修改FirstActivity中的点击事件:

            public void onClick(View v){
                //Intent.ACTION_DIAL是系统内置的动作
                Intent intent =new Intent(Intent.ACTION_DIAL);
                //在data部分指定了协议是tel,号码是10086
                intent.setData(Uri.parse("tel:10086"));
                //启动活动
                startActivity(intent);

            }

运行:点击button 1:
在这里插入图片描述

4.利用Intent传递数据
(1)向下一个活动传递数据

例子:把一个字符串从FirstActivity传到SecondActivity:
修改FirstActivity中的点击事件:

            public void onClick(View v){
                //要传递的字符串
                String data="Hello SecondActivity!";
                //显式的Intent方式来启动
                Intent intent=new Intent(FirstActivity.this,SecondActivity.class);
                //putExtra把data暂存在intent中
                //第一个参数:键,用于后面从Intent中取值
                //第二个参数:要传递的数据
                intent.putExtra("extra_data",data);
                startActivity(intent);

            }

在SecondActivity中将数据取出并打印出来

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second_layout);

        //取出数据并打印
        //取出intent
        Intent intent=getIntent();
        //通过键取出数据
        String data=intent.getStringExtra("extra_data");
        //打印
        Log.d("SecondActivity",data);
    }
}

运行结果:
在这里插入图片描述

(2)返回数据给上一个活动

例子:当SecondActivity销毁时,把数据传回给FirstActivity。
修改FirstActivity中的点击事件:注意这里的startActivityForResult()方法,和startAcitvity()方法一样,都是用于启动活动的,但这个方法在启动的活动2销毁的时候,可以返回数据给第一个活动。

            public void onClick(View v){
                //显式intent启动活动
                Intent intent =new Intent(FirstActivity.this,SecondActivity.class);
                //启动活动SecondActivity,当SecondActivity销毁时能够返回一个结果给FirstActivity
                //当SecondActivity销毁时,会回调FirstActivity的onActivityResult()方法
                //第一个参数是intent,第二个参数是请求码
                startActivityForResult(intent,1);
            }

接下来在SecondActivity中对按钮进行注册点击事件,并在点击事件中添加返回数据的逻辑:

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second_layout);

        Button button2=(Button)findViewById(R.id.button_2);
        button2.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                //intent仅仅用于传递数据
                Intent intent=new Intent();
                //把数据暂存到intent中
                intent.putExtra("data_return","Hello FirstActivity!");
                //专门用于向上一个活动返回数据的
                //第一个参数:处理结果 第二个参数:把带有数据的Intent传回去
                setResult(RESULT_OK,intent);
                //销毁当前活动
                finish();
            }
        });
    }
}

当SecondActivity销毁时,会回调FirstActivity的onActivityResult()方法,因此要重写这个方法

    //当SecondActivity销毁时,会回调FirstActivity的onActivityResult()方法
    //重写这个方法
    //第一个参数:请求码 第二个参数:处理结果 第三个参数:带有数据的intent
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data){
        switch(requestCode){
            case 1:
                if(resultCode==RESULT_OK){
                    //取出数据
                    String returnedData= data.getStringExtra("data_return");
                    Log.d("FirstActivity",returnedData);
                }
                break;
            default:
        }
    }

运行结果:当按完button1 跳到活动2,按完button2销毁活动2后:
在这里插入图片描述
当SecondActivity不通过按钮返回时,通过按back键返回时,可以在SecondActivity中重写onBackPressed达到相同的效果:

    @Override
    public void onBackPressed(){
        Intent intent=new Intent();
        intent.putExtra("data_return","Hello FirstActivity!");
        setResult(RESULT_OK,intent);
        finish();
    }
5.启动活动的最佳写法

在每个活动中都添加一个actionStart方法,如SecondActivity:

public class SecondActivity extends BaseActivity {
    public static void actionStart(Context context,String data1,String data2){
        Intent intent=new Intent(context,SecondActivity.class);
        intent.putExtra("param1",data1);
        intent.putExtra("param2",data2);
        context.startActivity(intent);
    }

这样一来,当别的活动调用它的时候,就只调用这个方法就可以了,如FirstActivity启动SecondActivity:

public void onClick(View v){
                SecondActivity.actionStart(FirstActivity.this,"data1","data2");
            }
        });

这种写法避免了在FirstActivity中写出要传入的数据,而现实中我们往往是不知道SecondActivity需要什么数据的,因此确定要的数据在SecondActivity中直接定义就好,再由别的活动进行调用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值