Antroid应用核心Intent学习笔记
目录
Android 应用开发中另一项比较重要的对象,Intent(意图)
学习思路为以下几个阶段:
- 初识Intent
- Intent对象的属性
- Intent的种类
- 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的不同常量值设定如下链接:
通常根据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属性:对执行动作的类别进行描述。
两者通常组合使用:调用系统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的学习更进一步了解了解更深的机制。需要改进之处欢迎大家指出!