【Antroid之应用核心Intent】

Antroid应用核心Intent学习笔记

目录

Antroid应用核心Intent学习笔记

1.初识Intent(意图)

2.Intent对象的属性

2.1 Component name

2.2 Activity&&Data

2.3 Activity&&Category

2.4 Extras && Flags

3.Intent种类

3.1 显式Intent

3.2 隐式Intent

3.3 显式Intent和隐式Intent的区别

4.Intent 过滤器

总结


Android 应用开发中另一项比较重要的对象,Intent(意图)

学习思路为以下几个阶段:

  1. 初识Intent
  2. Intent对象的属性
  3. Intent的种类
  4. Intent的过滤器

1.初识Intent(意图)

Intent的概述:通常Android会用到Activity,service,BroadcastReceiver三个组件共同组成APP。

例子:例如网购我们所购买的商品相当于数据,快递员送货上门进行商品输送类似于Intent进行数据传输。商家将数据打包(Bundle对象),快递员(Intent对象)。

其工作原理图如下:

Intent 的三种基本应用:主要实现组件之间的通信功能。

1.用来开启一个activity,实现两个Activity之间的跳转。

2.开启一个sevices,例如点击下载启动后台下载服务。

3.用来传递广播,发送广播通过Intent传输给广播接收器实现传递广播。

2.Intent对象的属性

Intent本质:一组被捆绑的信息。如下图所示其作为载体承载多种属性

Intent 组成元素的列表说明:

2.1 Component name

作用:用来设置Intent组件名称的。通过设置component name来开启其他Activity。

通过(包名+类名 ->activity)

设置方法:setComponent()方法进行设置需要传入ComponentName,ComponentName包含两个参数(包名,类名)。


案例:Mainactivity设置按钮点击跳转Detailactivity页面(两个activity位于同一个包)

package com.example.component;

import androidx.appcompat.app.AppCompatActivity;

import android.content.ComponentName;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

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

        Button button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //1.启动Intent首先先创建intent对象
                Intent intent = new Intent();
                //2.需要使用Component属性需要先定义对象传入(包名和完整类名)
                ComponentName componentName = new ComponentName("com.example.component","com.example.component.DetailActivity");
                //3.调用setComponent()方法使用组件名称属性
                intent.setComponent(componentName);
                //4.启动该activity
                startActivity(intent);
            }
        });
    }
}

2.2 Activity&&Data

Activity属性:用来指定将要执行的动作的。

Data属性:用来指定具体的数据的,常见URI对象。

两者通常组合使用:例如(Activity+Data组合)==(我想喝+水)。

Activity的不同常量值设定如下链接:

Intent  |  Android Developers

通常根据Activity不同常量其Date的类型也不相同。


实例:使用Intent实现关于页面中的拨打电话和发送短信功能。

//首先在菜单文件中添加实验所需的权限
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.activity_and_date">
    //拨打电话权限
    <uses-permission android:name="android.permission.CALL_PHONE" />
    //发送短信权限
    <uses-permission android:name="android.permission.SEND_SMS" />
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.Activity_Study">
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>
//xml布局文件即activity_main.xml文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="人物信息:孙悟空"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="家庭住址:花果山水帘洞XXX"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="人物经历:石猴降世,拜师学艺,大闹天宫,西天取经"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <ImageButton
            android:id="@+id/image_button_phone"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="50dp"
            android:layout_marginTop="20dp"
            android:adjustViewBounds="true"
            android:background="#0000"
            android:maxWidth="50dp"
            android:maxHeight="50dp"
            android:scaleType="fitXY"
            android:src="@drawable/bodadianhua" />

        <ImageButton
            android:id="@+id/image_button_sms"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="50dp"
            android:layout_marginTop="20dp"
            android:adjustViewBounds="true"
            android:background="#0000"
            android:maxWidth="50dp"
            android:maxHeight="50dp"
            android:scaleType="fitXY"
            android:src="@drawable/fasongduanxin" />

    </LinearLayout>

</LinearLayout>

java逻辑代码

//java 逻辑代码
package com.example.activity_and_date;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageButton;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //1.设置按钮对象
        ImageButton imageButton1 = findViewById(R.id.image_button_phone);
        ImageButton imageButton2 = findViewById(R.id.image_button_sms);
        //5.为两个监听按钮设置监听器对象
        imageButton1.setOnClickListener(l);
        imageButton2.setOnClickListener(l);
    }
    //2.设置监听器对象
    View.OnClickListener l = new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            //1.需要打开指定的activity,此处设置intent对象和相应的内容
            Intent intent = new Intent();
            //2.将OnClickListener对象转换为图片按钮
            ImageButton imageButton=(ImageButton) view;
            if(imageButton.getId() == R.id.image_button_phone){
                //3.实现拨打电话代码
                intent.setAction(intent.ACTION_DIAL);
                intent.setData(Uri.parse("tel:123456"));
                startActivity(intent);
            } else if (imageButton.getId() == R.id.image_button_sms) {
                //4.实现发送短信(设置发送人和内容)
                intent.setAction(intent.ACTION_SENDTO);
                intent.setData(Uri.parse("sms to:123456"));
                intent.putExtra("sms_body","welcome to android!");
                startActivity(intent);
            }

        }
    };
}

2.3 Activity&&Category

Activity属性:用来指定将要执行的动作的。

category属性:对执行动作的类别进行描述。

Intent  |  Android Developers

两者通常组合使用:调用系统Activity或者启动Android系统的其他应用程序组件。


实例:使用Intent模式关闭activity返回系统桌面

点击返回主页即正常返回系统桌面

//xml布局主页
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/earth"
    tools:context=".MainActivity">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="#0000"
        android:id="@+id/btn1"
        android:text="返回主页"
        android:textSize="30sp"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="125dp"/>



</RelativeLayout>
package com.example.category;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

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

        Button button = findViewById(R.id.btn1);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //1.返回系统页面
                Intent intent = new Intent();
                //2.设置activity和category常量
                intent.setAction(intent.ACTION_MAIN);
                intent.addCategory(intent.CATEGORY_HOME);
                startActivity(intent);
            }
        });
    }
}

2.4 Extras && Flags

Extras属性:

作用:主要在Intent组件中添加附加信息的。通常附加信息以键值对的形式进行保存。

putExtras()方法将bundle对象作为附加信息进行添加。

getExtras()方法对bundle对象所传输的信息进行获取。

常用领域:多个Activity之间进行数据交互时经常使用。


Flags属性:

作用:指示Android程序如何启动另一个Activity,例如指示某个actvity属于哪个Task.

Task:实际上是以栈模式聚集到一起的activity组件的集合,主要也是用来保存activity.

Flags属性也可以用来指示程序启动如何处理,比如说指定其是否为近期的列表当中。


案例:写两个activity(A,B),点击A中的按钮跳转到B界面,此时回到手机主页再次点开该程序,程序自动打开到B页面。(A中的代码如下),此时添加Flags属性,得到的结果是每次打开程序都在A页面。即用户一旦离开页面该activity自动关闭,再次打开即重启该程序。

package com.example.extras_flags;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

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

        Button button = findViewById(R.id.but1);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this, Details.class);
                //添加如下代码,让A不在历史栈中保留
                intent.setFlags(intent.FLAG_ACTIVITY_NO_HISTORY);
                startActivity(intent);

            }
        });
    }
}

3.Intent种类

显式Intent和隐式Intent

3.1 显式Intent

使用场景:明确知道activity包名类名或services的类名称。

//显式Intent对象的语法格式参数说明(上下文对象,目标activity)
Intent intent = new Intent(MainActivity.this, Details.class);

3.2 隐式Intent

使用场景:根据所传参数自动匹配符合其条件的Activity。通常需要为Intent定义action/category等。

案例:页面设置按钮,点击打开百度网页。

package com.example.extras_flags;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

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

        Button button = findViewById(R.id.but1);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //1.定义Intent
                Intent intent = new Intent();
                //2.启动另一个网页(采用activity和data组合)->(将页面展示给用户,uri对象)
                intent.setAction(intent.ACTION_VIEW);
                intent.setData(Uri.parse("https://www.baidu.com"));
                startActivity(intent);



            }
        });
    }
}

3.3 显式Intent和隐式Intent的区别


4.Intent 过滤器

本质:根据某一个Intent当中的date/category等属性,对适合接收Intent的组件进行匹配和筛选的作用机制,常用于隐式Intent来启动activity的场景。

设置方式:通过<intent-filter>标记在AndroidManifest.xml文件中配置。

action:指定组件所能相应的动作。

actegory:指定以哪种方式去执行Intent请求的动作。

data:像


实例:点击按钮查看大图,通过配置过滤器尽心筛选显示

1.点击查看大图触发intent

2.触发intent

3.正常显示大图

设置文件两个activity

//涉及修改文件
MainActivity.java
Contacts_Activity.java
activity_main.xml
activity_contacts.xml
AndroidManifest.xml


//MainActivity.java
package com.example.intent;


import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);

        Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent();
                intent.setAction(intent.ACTION_VIEW);
                startActivity(intent);
            }
        });


    }
}
//activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <ImageView
        android:id="@+id/image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="20dp"
        android:adjustViewBounds="true"
        android:maxWidth="100dp"
        android:maxHeight="100dp"
        android:scaleType="fitXY"
        android:src="@drawable/car" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/image"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="20dp"
        android:background="#0000"
        android:text="查看大图"
        android:textColor="@color/black" />


</RelativeLayout>
//Contacts_Activity.java
package com.example.intent;


import android.app.Activity;
import android.os.Bundle;
import android.view.WindowManager;

public class Contacts_Activity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_contacts);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);

    }
}
//activity_contacts.xml
<?xml version="1.0" encoding="utf-8"?>
<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=".Contacts_Activity">

    <ImageView
        android:id="@+id/image1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@drawable/car" />

</RelativeLayout>
//AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.Activity_Study">
        <activity
            android:name=".Contacts_Activity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.VIEW"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

总结

以上就是Intent学习的相关内容,通过对Intent的学习更进一步了解了解更深的机制。需要改进之处欢迎大家指出!

  • 20
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值