版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第8章理解和使用Intent在基于HTML的页面程序中,程序使用“超链接”实现页面之间跳转。Android应用程序是由一个或多个Activity组成的,一个Activity相当于HTML的一个页面,那么,当一个Android应用程序具有多个相互联系的Activity时,它们之间是如何实现跳转的呢?Android的Activity之间是通过Intent来实现跳转功能的。Intent的作用不仅是实现Activity之间的跳转,它还是Android平台的各个部分之间实现信息沟通的桥梁。本章将对Intent的使用进行详细的介绍。目录8.1Intent入门8.2细说Intent8.3Intent匹配/解析8.4获得Activity返回的结果8.5使用Intent打开第三方APP应用8.6课后同步练习8.7广播消息和广播接收器8.1Intent入门Intent是Android体系中非常重要的组件,为了深入了解Intent的使用,先从入门例子开始。8.1.1入门举例首先通过一个简单的例子来说明什么是Intent及Intent的基本应用。这个例子程序的目标是:程序首先显示一个Activity,在这个Activity上使用TextView组件显示一张图片的名称及一个按钮,点击这个按钮,将会在一个新的Activity中显示这张图片。这个例子虽然非常简单,但是能很好地帮助理解Intent。新建一个名为ch0801的Android工程,然后修改res/layout/activity_main.xml,这是该应用程序的主界面,内容如下:<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android"xmlns:tools="/tools"android:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"style="?android:attr/buttonBarStyle"tools:context=".MainActivity">
<TextViewandroid:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"style="@android:style/TextAppearance.Holo.Large"android:gravity="center"android:text="@string/text_beauty"/>
<Viewandroid:layout_width="match_parent"android:layout_height="10dp"android:background="#000"/>
<Buttonandroid:id="@+id/id_button"android:layout_width="match_parent"style="?android:attr/buttonBarButtonStyle"android:layout_height="0dp"android:layout_weight="1"android:textSize="24sp"android:text="@string/text_button"/>
</LinearLayout>为了能在一个新的Activity中显示一张图片,需要为这个Activity创建一个布局资源,为此,在res/layout目录下,新建一个名为layout02.xml的布局文件,其内容如下:<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent">
<ImageViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:src="@mipmap/a03"android:scaleType="center"android:contentDescription="@string/text_empty"/>
</LinearLayout>修改res/values/strings.xml文件,修改后的内容如下:<resources><stringname="app_name">ch0801</string>
<stringname="text_beauty">一张美丽的风景照片</string><stringname="text_empty">””</string><stringname="text_button">点击按钮显示最美风景</string>
</resources>如果此时运行这个程序,能够正确显示第一个Activity界面,可是当点击按钮时,不会显示第二个Activity界面。为了能显示第二个Activity界面,需要创建一个新的Activity,使之显示layout02.xml布局的界面。为此,在ch0801工程下,新建名为Activity02的Java类文件,其文件内容如下:packagecom.example.ch0801;
importandroid.os.Bundle;
importandroidx.appcompat.app.AppCompatActivity;
publicclassActivity02extendsAppCompatActivity{@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.layout02);}}现在有两个Activity:MainActivity和Activity02,它们分别显示activity_main.xml和layout02布局。可是如何把它们关联起来呢?也就是如何在点击第一个界面上的按钮时,启动第二个Activity运行来显示layout02布局呢?为此,需要修改MainActivity.java,使之监听对按钮的点击事件,并对点击事件进行处理,修改后的MainActivity.java文件的内容如下:packagecom.example.ch0801;
importandroid.content.Intent;importandroid.os.Bundle;importandroid.view.View;importandroid.widget.Button;
importandroidx.activity.EdgeToEdge;importandroidx.appcompat.app.AppCompatActivity;importandroidx.core.graphics.Insets;importandroidx.core.view.ViewCompat;importandroidx.core.view.WindowInsetsCompat;
publicclassMainActivityextendsAppCompatActivityimplementsView.OnClickListener{
@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);EdgeToEdge.enable(this);setContentView(R.layout.activity_main);ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main),(v,insets)->{InsetssystemBars=insets.getInsets(WindowInsetsCompat.Type.systemBars());v.setPadding(systemBars.left,systemBars.top,systemBars.right,systemBars.bottom);returninsets;});
Buttonbtn=this.findViewById(R.id.id_button);btn.setOnClickListener(this);}
@OverridepublicvoidonClick(Viewv){Intenti=newIntent(this,Activity02.class);this.startActivity(i);}}Android规定:所有的Activity都必须在工程AndroidManifest.xml文件中进行登记。为此,修改AndroidManifest.xml文件,内容如下:<?xmlversion="1.0"encoding="utf-8"?><manifestxmlns:android="/apk/res/android"xmlns:tools="/tools">
<applicationandroid:allowBackup="true"android:dataExtractionRules="@xml/data_extraction_rules"android:fullBackupContent="@xml/backup_rules"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme.Ch0801"><activityandroid:name=".MainActivity"android:exported="true"><intent-filter><actionandroid:name="ent.action.MAIN"/><categoryandroid:name="ent.category.LAUNCHER"/></intent-filter></activity>
<activityandroid:name=".Activity02"android:exported="false"></activity>
</application>
</manifest>8.1.2课堂同步练习编写一个与上一节的例子相似的、能通过Intent打开新的Activity的程序。例如,可以通过点击一张图片显示一个文本框,该文本框用来介绍该图片的一些基本情况。8.2细说IntentAndroid的Intent对象是联系各个Activity的关键对象。Intent,翻译成中文就是“意图”,可以这样来理解Intent:通过Intent对象,来告诉Android要做什么。例如,在上一节的例子中,按如下方式构建了一个Intent:这段代码的意思就是说,希望Android平台打开Activity02界面。按照这种方式创建的Intent称为显式Intent:在Intent中,明确地告诉Android系统要启动的Activity。还有一种Intent称为隐式Intent:在Intent中指定一些条件,由Android系统根据这些条件来启动最能满足条件的Activity。Intenti=newIntent(this,Activity02.class);this.startActivity(i);为了便于理解隐式Intent,修改上一节中的例子。首先,修改AndroidManifest.xml为如下内容:<?xmlversion="1.0"encoding="utf-8"?><manifestxmlns:android="/apk/res/android"xmlns:tools="/tools">
<applicationandroid:allowBackup="true"android:dataExtractionRules="@xml/data_extraction_rules"android:fullBackupContent="@xml/backup_rules"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme.Ch0801"><activityandroid:name=".MainActivity"android:exported="true"><intent-filter><actionandroid:name="ent.action.MAIN"/>
<categoryandroid:name="ent.category.LAUNCHER"/></intent-filter></activity>
<activityandroid:name=".Activity02"android:exported="false"><intent-filter><actionandroid:name="com.example.ch0801.A1"/><categoryandroid:name="ent.category.DEFAULT"/></intent-filter></activity>
</application>
</manifest>为了能够采用隐式的方式打开Activity02,修改MainActivity.java为如下内容:packagecom.example.ch0801;
importandroid.content.Intent;importandroid.os.Bundle;importandroid.view.View;importandroid.widget.Button;
importandroidx.activity.EdgeToEdge;importandroidx.appcompat.app.AppCompatActivity;importandroidx.core.graphics.Insets;importandroidx.core.view.ViewCompat;importandroidx.core.view.WindowInsetsCompat;
publicclassMainActivityextendsAppCompatActivityimplementsView.OnClickListener{
@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);EdgeToEdge.enable(this);setContentView(R.layout.activity_main);ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main),(v,insets)->{InsetssystemBars=insets.getInsets(WindowInsetsCompat.Type.systemBars());v.setPadding(systemBars.left,systemBars.top,systemBars.right,systemBars.bottom);returninsets;});
Buttonbtn=this.findViewById(R.id.id_button);btn.setOnClickListener(this);}
@OverridepublicvoidonClick(Viewv){//Intenti=newIntent(this,Activity02.class);Intenti=newIntent("com.example.ch0801.A1");i.addCategory(Intent.CATEGORY_DEFAULT);this.startActivity(i);}}AndroidManifest.xml文件对Activity的配置,特别是<activity>标签的<intent-filter>子标签所指定的属性与创建Intent对象时所指定的各种属性是密切相关的:它们必须匹配才能打开指定的目标Activity。它们之间的关系如图。在创建Intent时,可以指明哪些条件,或者说,在为Activity定义<intent-filter>标签时,可以定义哪些条件呢?可以指明的条件包括action、data和category。下面将分别进行讲解。8.2.1Intent的action可以为创建的Activity定义一个用于打开Activity的action。action是一个字符串常量,可以任意定义,但是,Android建议的做法是,采用“Java包名+特定串”的形式来命名action。例如,为Activity02定义的action为:com.example.ch0801.A1。其中,com.example.ch0801是包名,而A1是特定的名称。这里需要强调的是,Activity与action不一定是1对1的关系,也就是说,可能多个Activity对应同名的action,这在Android中是允许的,当出现这种情况时,Android平台将弹出一个对话框,让用户选择满足条件的Activity来运行。Intent类已经预定义了一些action,包括Intent.ACTION_MAIN、Intent.ACTION_VIEW、Intent.ACTION_EDIT、Intent.ACTION_PICK、Intent.ACTION_DIAL、Intent.ACTION_CALL、Intent.ACTION_DELETE、Intent.ACTION_INSERT、Intent.ACTION_SEARCH等。其中的每个action都有确定的含义,例如,Intent.ACTION_MAIN表示包含这个action的Activity是Android应用程序的入口Activity,也就是,当运行某个Android应用程序时,首先打开包含这个action的Activity;Intent.ACTION_PICK表示从某个列表中选择一条信息。指明一个Intent的action,有以下两种方式:其一,通过Intent类的构造函数newIntent(Stringaction)及newIntent(Stringaction,URIuri);其二,通过Intent类的setAction(Stringaction)函数。要指明一个Activity能被哪一个或哪些action打开,需要在AndroidManifest.xml文件中,使用<intent-filter>标签来说明,如下代码片段所示:<activityclass=".NotesList"android:label="@string/title_notes_list"><intent-filter><actionandroid:name="ent.action.VIEW"/><actionandroid:name="ent.action.EDIT"/><actionandroid:name="ent.action.PICK"/><categoryandroid:name="ent.category.DEFAULT"/><dataandroid:mimeType="vnd.android.cursor.dir/vnd.google.note"/></intent-filter></activity>8.2.2Intent的categorycategory,顾名思义,就是类别的意思,它是Android对Activity进行分类的一种手段。例如,如果设定某个Activity的category为LAUNCHER,那么,Android会在启动时将它显示在HOME屏幕上以便于运行它;如果设定某个Activity的category为HOME,那么,Android在启动时会把它作为Android系统的HOME屏幕。Intent已经定义了一些category常量。常用的category包括Intent.CATEGORY_DEFAULT、Intent.CATEGORY_LAUNCHER、Intent.CATEGORY_INFO、Intent.CATEGORY_HOME等。一般而言,在AndroidManifest.xml中定义Activity时,需要将Activity的category设置为Intent.CATEGORY_DEFAULT。8.2.3Intent的data在通过隐式Intent打开Activity时,除了指明Activity的action,经常还指明Activity所支持的data。在Android中,通过Intent的data指明要操作的目标数据或者数据类型。Android中的data也是通过URI来指明的。URI有如下三种形式:scheme://host:port/pathscheme://host:port/pathPatternscheme://host:port/pathPrefix要指明某个Activity的data属性,需要在AndroidManifest.xml文件中,在Activity配置的<intent-filter>子标签中通过<data>标签指定,指定intent-filter的data属性的一般形式如下:通过<activity>标签的子标签<intent-filter>的<data>子标签,可以指定某个Activity的data属性,其中包括host、mimeType、path、pathPattern、pathPrefix、port和scheme。<dataandroid:host="string"android:mimeType="string"android:path="string"android:pathPattern="string"android:pathPrefix="string"android:port="string"android:scheme="string"/>为了通过Intent打开设定了data属性的某个Activity,需要在创建Intent对象时,明确设置data属性。在Intent类中设置data属性的方法如下包括:(1)setData(Uridata)设置Intent的data属性,注意这个方法将自动清除之前设置的mimeType。(2)setDataAndType(Uridata,StringmimeType)同时设置Intent的data和mimeType。(3)setType(StringmimeType)设置Intent的mimeType,这个方法将自动清除之前设置的data属性。下面举一个例子来说明如何在<intent-filter>标签中设置data属性,并使用隐式Intent来打开设置了data属性值的Activity。首先在AndroidManifest.xml文件中配置某个Activity,内容如下:通过创建如下的Intent对象来通过隐式Intent打开这个Activity:<activityclass=".NotesList"android:label="@string/title_notes_list"> <intent-filter> <actionandroid:name="ent.action.MAIN"/> <categoryandroid:name="ent.category.LAUNCHER"/> </intent-filter> <intent-filter> <actionandroid:name="ent.action.VIEW"/> <actionandroid:name="ent.action.EDIT"/> <actionandroid:name="ent.action.PICK"/> <categoryandroid:name="ent.category.DEFAULT"/> <dataandroid:scheme="content"/> <dataandroid:mimeType="vnd.android.cursor.dir/vnd.google.note"/> </intent-filter></activity>Uriuri=Uri.parse("content://ject:200/folder/subfolder/etc");Intenti=newIntent("ent.action.EDIT");i.setDataAndType(uri,"vnd.android.cursor.dir/vnd.google.note");this.startActivity(i);8.2.4Intent的extra在通过Intent启动某个Activity运行时,有时可能需要传递一些附加的数据到被启动的Activity中,这可以使用extra。extra只作为传递给目标Activity的附加数据,不作为挑选Activity的匹配依据。extra是以“key/value”形式表示的数据,其中的key是String类型的“键”,value可以是Java基本数据类型也可以是实现了android.os.Parcelable接口的对象数据类型。Intent类提供了写入及读取基本数据类型数据的方法。intent.putExtra("productName","iPhone");intent.putExtra("ProductAmount",100);Stringpn=intent.getStringExtra("productName");intpa=intent.getIntExtra("ProductAmount");8.3Intent匹配/解析从上面的介绍可以看出,Intent对象与<intent-filter>标签是密切相关的:在通过Intent对象来启动某个Activity时,必须将Intent对象中所设定的属性(action、data和category)与<intent-filter>标签中所配置的属性进行匹配,从而打开能够匹配的Activity。把这种匹配操作称为Intent匹配/解析。Android按如下步骤来解析Intent。其一,在显式匹配中,在Intent对象中要明确指定要打开的Activity的类的名称。其二,在隐式匹配中,如果在Intent中设定了action,且action出现在<intent-filter>标签中则匹配;如果在Intent中设定了data,且data属性出现在<intent-filter>标签的data列表中,则匹配;如果在Intent中设定了category,且category必须在<intent-filter>标签的category列表中,则匹配。8.4获得Activity返回的结果如果源Activity想要获得目标Activity的执行结果,那么,源Activity不能使用startActivity()方法打开目标Activity,而应该使用startActivityForResult()方法打开目标Activity。当通过startActivityForResult()打开目标Activity时,当目标Activity执行完毕时,Android平台将调用源Activity的onActivityResult()方法,因此,源Activity通过这个方法的参数获取目标Activity的执行结果。startActivityForResult()方法的原型如下:
publicvoidstartActivityForResult(Intentintent,intrequestCode)其中的requestCode是源Activity传递的一个识别参数。当目标Activity执行完毕,Android平台调用源Activity的onActivityResult()方法。onActivityResult()方法的原型如下:
protectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata)获得目标Activity的返回结果的前提是:目标Activity首先要返回结果。如果目标Activity根本就没有返回结果,源Activity也就无从获得返回结果了。目标Activity采用setResult()方法来设置返回数据。setResult()方法的原型如下:publicfinalvoidsetResult(intresultCode)publicfinalvoidsetResult(intresultCode,Intentdata)8.4.1使用startActivityForResult下面举一个例子说明如何启动一个Activity,并从目标Activity得到执行结果。这个例子在首界面Activity,也就是源Activity中显示一个按钮,当点击按钮时,将显示一个新的包含两张图片的Activity,也就是目标Activity,点击任何一张图片,将关闭目标Activity,并在首界面源Activity中显示被点击图片的编号。为此,新建名称为ch0802的工程,修改其主布局activity_main.xml文件为如下内容:<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android"xmlns:tools="/tools"android:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"style="?android:attr/buttonBarStyle"tools:context=".MainActivity">
<Buttonandroid:id="@+id/id_button"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"style="?android:attr/buttonBarButtonStyle"android:textSize="48sp"android:text="@string/text_button"/>
<TextViewandroid:id="@+id/id_textview"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"style="@android:style/TextAppearance.Holo.Large"android:gravity="center"/>
</LinearLayout>然后在res/layout目录下,新建一个名为activity_second.xml的布局文件,内容如下:<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent">
<ImageViewandroid:id="@+id/id_iv01"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"android:scaleType="fitCenter"android:src="@mipmap/a01"android:contentDescription="@string/text_empty"/>
<Viewandroid:layout_width="match_parent"android:layout_height="4dp"android:background="#aaa"/>
<ImageViewandroid:id="@+id/id_iv02"android:layout_width="match_parent"android:layout_height="0dp"android:layout_weight="1"android:scaleType="fitCenter"android:src="@mipmap/a02"android:contentDescription="@string/text_empty"/>
</LinearLayout>在res/mipmap目录下,放置两个需要在该布局文件中用到的图片资源文件:a01.jpg文件和a02.jpg文件。接下来修改res/values/strings.xml文件,在其中添加布局文件中用到的字符串引用,修改后的内容如下:<resources><stringname="app_name">ch0802</string>
<stringname="text_button">点击</string><stringname="text_empty">""</string>
</resources>修改MainActivity.java文件,修改后的内容如下:packagecom.example.ch0802;
importandroid.app.Activity;importandroid.content.Intent;importandroid.os.Bundle;importandroid.view.View;importandroid.widget.Button;importandroid.widget.TextView;
importandroidx.activity.EdgeToEdge;importandroidx.appcompat.app.AppCompatActivity;importandroidx.core.graphics.Insets;importandroidx.core.view.ViewCompat;importandroidx.core.view.WindowInsetsCompat;
publicclassMainActivityextendsAppCompatActivityimplementsView.OnClickListener{publicstaticintRC01=1000;privateTextViewtv;
@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);EdgeToEdge.enable(this);setContentView(R.layout.activity_main);ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main),(v,insets)->{InsetssystemBars=insets.getInsets(WindowInsetsCompat.Type.systemBars());v.setPadding(systemBars.left,systemBars.top,systemBars.right,systemBars.bottom);returninsets;});
Buttonbtn=this.findViewById(R.id.id_button);btn.setOnClickListener(this);tv=this.findViewById(R.id.id_textview);}
@OverridepublicvoidonClick(Viewv){Intentintent=newIntent(this,SecondActivity.class);this.startActivityForResult(intent,MainActivity.RC01);}
@OverrideprotectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){super.onActivityResult(requestCode,resultCode,data);if((requestCode==MainActivity.RC01)&&(resultCode==Activity.RESULT_OK)){intwhich=data.getIntExtra("result",-1);tv.setText(which+"");}}
}还需要创建SecondActivity代码。在ch0802工程中,新建名为SecondActivity的Java类文件,在其中显示activity_second.xml布局,并加入图片的点击事件处理方法。SecondActivity.java文件的内容如下:packagecom.example.ch0802;
importandroid.app.Activity;importandroid.content.Intent;importandroid.os.Bundle;importandroid.view.View;importandroid.widget.ImageView;
importandroidx.appcompat.app.AppCompatActivity;
publicclassSecondActivityextendsAppCompatActivityimplementsView.OnClickListener{@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_second);
ImageViewiv01=this.findViewById(R.id.id_iv01);iv01.setOnClickListener(this);ImageViewiv02=this.findViewById(R.id.id_iv02);iv02.setOnClickListener(this);}
@OverridepublicvoidonClick(Viewv){intid=v.getId();Intentintent=newIntent();if(id==R.id.id_iv01){intent.putExtra("result",1);}else{intent.putExtra("result",2);}this.setResult(Activity.RESULT_OK,intent);this.finish();}
}在AndroidManifest.xml文件中配置SecondActivity,为此,修改该文件为如下内容:<?xmlversion="1.0"encoding="utf-8"?><manifestxmlns:android="/apk/res/android"xmlns:tools="/tools">
<applicationandroid:allowBackup="true"android:dataExtractionRules="@xml/data_extraction_rules"android:fullBackupContent="@xml/backup_rules"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme.Ch0802"><activityandroid:name=".MainActivity"android:exported="true"><intent-filter><actionandroid:name="ent.action.MAIN"/>
<categoryandroid:name="ent.category.LAUNCHER"/></intent-filter></activity>
<activityandroid:name=".SecondActivity"android:allowEmbedded="true"></activity>
</application>
</manifest>8.4.2使用registerForActivityResult从AndroidAPI29开始,startActivityForResult()方法被标注为废弃(备注:被废弃并不表示不能用,只是建议采用新方式而已),官方推荐使用registerForActivityResult。下面采用新方式来获取目标Activity的执行结果。为此,新建名称为ch0803的工程,将ch0802工程的文件复制到ch0803工程中,然后,修改MainActivity.java为如下代码:packagecom.example.ch0803;
importandroid.app.Activity;importandroid.content.Intent;importandroid.os.Bundle;importandroid.view.View;importandroid.widget.Button;importandroid.widget.TextView;
importandroidx.activity.EdgeToEdge;importandroidx.activity.result.ActivityResult;importandroidx.activity.result.ActivityResultCallback;importandroidx.activity.result.ActivityResultLauncher;importandroidx.activity.result.contract.ActivityResultContracts;importandroidx.appcompat.app.AppCompatActivity;importandroidx.core.graphics.Insets;importandroidx.core.view.ViewCompat;importandroidx.core.view.WindowInsetsCompat;
publicclassMainActivityextendsAppCompatActivityimplementsView.OnClickListener{privateTextViewtv;ActivityResultLauncher<Intent>launcher;
@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);EdgeToEdge.enable(this);setContentView(R.layout.activity_main);ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main),(v,insets)->{InsetssystemBars=insets.getInsets(WindowInsetsCompat.Type.systemBars());v.setPadding(systemBars.left,systemBars.top,systemBars.right,systemBars.bottom);returninsets;});
launcher=registerForActivityResult(newActivityResultContracts.StartActivityForResult(),newActivityResultCallback<ActivityResult>(){@OverridepublicvoidonActivityResult(ActivityResultresult){if(result.getResultCode()==RESULT_OK){assertresult.getData()!=null;intwhich=result.getData().getIntExtra("result",0);tv.setText(which+"");}}});
Buttonbtn=this.findViewById(R.id.id_button);btn.setOnClickListener(this);tv=this.findViewById(R.id.id_textview);}
@OverridepublicvoidonClick(Viewv){Intentintent=newIntent(this,SecondActivity.class);launcher.launch(intent);}}8.5使用Intent打开第三方APP应用在Android平台中,如果已知第三方程序的intent-filter,也就是其action、category、data的值,那么,就可以打开这些第三方程序,这也是为什么微信APP可以打开OfficeAPP、PDFAPP,乃至浏览器APP的原因。下面句子说明如何打开第三方APP。这个程序的主界面上有三个按钮,点击按钮分别打开三个第三方应用APP:浏览网页APP、拨打电话APP、发送短信APP。为此,新建名称为ch0804的工程,修改主界面布局activity_main.xml为如下代码:<?xmlversion="1.0"encoding="utf-8"?><LinearLayoutxmlns:android="/apk/res/android"xmlns:tools="/tools"android:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity">
<Buttonandroid:id="@+id/btn_browser"android:layout_width="match_parent"android:layout_height="64dp"android:text="浏览必应网页"/>
<Buttonandroid:id="@+id/btn_call"android:layout_width="match_parent"android:layout_height="64dp"android:text="拨打电话"/>
<Buttonandroid:id="@+id/btn_sm"android:layout_width="match_parent"android:layout_height="64dp"android:text="发送短信"/>
</LinearLayout>修改MainActivity.java,使之响应对按钮的点击,并打开对应的第三方应用。修改后的MainActivity.java的代码如下:packagecom.example.ch0804;
importandroid.content.Intent;import.Uri;importandroid.os.Bundle;importandroid.view.View;importandroid.widget.Button;
importandroidx.activity.EdgeToEdge;importandroidx.appcompat.app.AppCompatActivity;importandroidx.core.graphics.Insets;importandroidx.core.view.ViewCompat;importandroidx.core.view.WindowInsetsCompat;
publicclassMainActivityextendsAppCompatActivityimplementsView.OnClickListener{
@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);EdgeToEdge.enable(this);setContentView(R.layout.activity_main);ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main),(v,insets)->{InsetssystemBars=insets.getInsets(WindowInsetsCompat.Type.systemBars());v.setPadding(systemBars.left,systemBars.top,systemBars.right,systemBars.bottom);returninsets;});
Buttonbtn1=findViewById(R.id.btn_browser);btn1.setOnClickListener(this);Buttonbtn2=findViewById(R.id.btn_call);btn2.setOnClickListener(this);Buttonbtn3=findViewById(R.id.btn_sm);btn3.setOnClickListener(this);}
@OverridepublicvoidonClick(Viewv){Uriuri;Intentit;
intid=v.getId();if(id==R.id.btn_browser){uri=Uri.parse("/");it=newIntent(Intent.ACTION_VIEW,uri);startActivity(it);}elseif(id==R.id.btn_call){uri=Uri.parse("tel:5556");it=newIntent(Intent.ACTION_DIAL,uri);startActivity(it);}elseif(id==R.id.btn_sm){uri=Uri.parse("smsto:5556");it=newIntent(Intent.ACTION_SENDTO,uri);it.putExtra("sms_body","这是要发送的短
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025江西省电子信息工程学校工作人员招聘考试试题
- 2025江城哈尼族彝族自治县职业高级中学工作人员招聘考试试题
- 城市地下人行通道施工方案
- 2026年智能安防AI人脸识别创新报告
- 2026年制造业领域智能制造技术创新报告
- 智能研修模式中问题导向教学在心理健康教育中的应用与实践教学研究课题报告
- 幼儿园教师观察记录工具使用熟练度影响研究-基于观察记录质量与培训记录关联数据分析
- 2026年数码配件生产管理创新报告
- 2026年生物识别安全技术行业创新报告
- 2025年城市智慧停车管理系统与城市交通一体化可行性研究
- 光气管道施工方案设计
- DB41-T 2500-2023 地下水监测井洗井、修井技术规范
- 上海铁路局招聘笔试考什么内容
- 北师大版七年级数学下册-第一章-名校检测题【含答案】
- 浙二医院胸外科护士进修汇报
- DGTJ08-2323-2020 退出民防序列工程处置技术标准
- 党支部书记讲廉洁党课讲稿
- 广东省佛山市华英学校2024-2025学年上学期七年级入学分班考试英语试卷
- 猴痘培训课件
- 施工试验送检方案(3篇)
- YY 0267-2025血液净化体外循环系统血液透析器、血液透析滤过器、血液滤过器及血液浓缩器用体外循环血路/液路
评论
0/150
提交评论