android调用系统文件管理器不能只选择文件夹

android调用系统文件管理器不能只选择文件夹,第1张

如果你想要在Android设备上调用系统文件管理器,只选择文件夹而不是文件,可以尝试以下步骤:

1 首先,在你的应用中创建一个Intent对象

2 设置Intent的Action为ACTION_OPEN_DOCUMENT_TREE,这样系统会打开一个文件目录选择器。

3 调用startActivityForResult方法,并传入Intent对象和一个请求码。

4 在onActivityResult方法中,检查请求码和返回结果是否正确,并从返回的Intent对象中获取所选文件夹的URI。

5 使用getContentResolver()takePersistableUriPermission方法授予应用访问选定目录的权限,以便你可以在不重新授权的情况下访问该目录。

在使用这种方法时,需要注意的是,一些Android设备可能不支持ACTION_OPEN_DOCUMENT_TREE这个Action,因此你需要在使用之前检查设备的兼容性。另外,获取到的是URI而不是绝对路径,如果需要使用绝对路径,可以使用DocumentFilefromTreeUri方法将URI转换为文件夹对象,再通过DocumentFile对象获取绝对路径。

Inaccountinfojava:

Intent intent = new Intent(Inaccountinfothis,InfoManageclass); //创建Intent对象

intentputExtra(“FLAG”,new String[]{“strid”,“strType”}); //传递数据

startActivity(intent); //执行intent *** 作

InfoManagejava:

Intent intent = getIntent(); // 获取Intent对象

Bundle bundle = intentgetExtras(); //获取传人的数据,并使用Bundle记录

//!!!

strinfos = bundlegetStringArray("FLAG");

for (int i = 0; i < strinfoslength; i++) {

Systemoutprintln(strinfos[i]);

}

把你写的程序稍微变动一下,最后输出的结果是“strid”,“strType” 。具体你想要表达什么,我不太清楚,这个是测试过后的结果。向这类问题,你可以自己在eclipse中测试,我估计你是刚学习android,如果是这样的话,建议多动手,多看看>

意图和意图过滤器Intents and Intent Filters

一个应用程序的三个核心组件-活动,服务和广播接收器是通过消息即意图(Intents)来激活的。Intent息传送是相同或不同应用中组件运行时晚绑定的一种机制。意图本身,一个意图对象,是一个包含被执行 *** 作抽象描述的被动的数据结构-或者,对于广播而言,是某件已经发生并被声明的事情的描述。存在不同的机制来传送意图到每种组件中:

• 一个意图对象是传递给ContextstartActivity()或者ActivitystartActivityForResult()来启动一个活动或者让一个存在的活动去做某些新的事情。

• 一个意图对象是传递给ContextstartService()来发起一个服务或者递交新的指令给运行中的服务。类似的,一个意图能被传递给ContextbindService() 来在调用组件和一个目标服务之间建立连接。作为一个可选项,它可以发起这个服务如果还没运行的话。

• 传递给任意广播方法(例如ContextsendBroadcast(),ContextsendOrderedBroadcast(), 或者ContextsendStickyBroadcast())的意图对象被传递给所有感兴趣的广播接收者。许多种广播产生于系统代码。

在每个例子里,Android系统找到合适的活动,服务,或者一组广播接收者来回应这个意图,必要时实例化它们。这些消息传送系统没有重叠:广播意图仅被传递给广播接收者,永远不会给活动或者服务。一个传送给startActivity()的意图是只会被传递给一个活动,永远不会给一个服务或广播接收者,如此类推。

这篇文档以意图对象的描述开始,然后描述Android映射意图到组件的规则-如何解决哪个组件应该接收一个意图消息。对于没有显式命名一个目标组件的意图,这个过程包括对照与潜在目标相关联的意图过滤器来测试这个意图对象。

意图对象Intent Objects

一个意图Intent对象是一堆信息。它包含接收这个意图的组件感兴趣的信息(例如将要采取的动作和 *** 作的数据)再加上Android系统感兴趣的信息(例如应该处理这个意图的组件类别和如何启动一个目标活动的指令):

组件名称Component name

应该处理这个意图的组件名字 这个字段是一个ComponentName对象- 一个组合物:目标组件的完全合格的类名 (比如"comexampleprojectappFreneticActivity") 以及应用程序描述文件中设置的组件所在包的名字(比如, "comexampleproject") 这个组件名字的包部分和描述文件中设置的包名字不一定要匹配。

组件名字是可选的。如果被设置了,这个意图对象将被传递到指定的类。如果没有, Android使用另外的意图对象中的信息去定位一个合适的目标- 请看本文稍后描述的意图解析Intent Resolution。

组件名字通过如下方法:setComponent(),setClass(), 或者setClassName()设置并通过getComponent()读取。

Activity作为安卓四大组件之一,是最重要也是用得最多的组件,涉及的知识点非常多,有些知识点平时开发很少用到,但在某些场景下需要特别注意,本文详细整理了Activity涉及的知识点,供开发参考。

针对Activity可以提出很多问题,如:

Activity 的生命周期?

Activity 之间的通信方式?

Activity 各种情况下的生命周期?

横竖屏切换时 Activity 的生命周期?

前台切换到后台,然后再回到前台时 Activity 的生命周期?

d出 Dialog 的时候按 Home 键时 Activity 的生命周期?

两个Activity之间跳转时的生命周期?

下拉状态栏时 Activity 的生命周期?

Activity 与 Fragment 之间生命周期比较?

Activity 的四种 LaunchMode(启动模式)的区别?

Activity 状态保存与恢复?

Activity的转场动画有哪些实现方式?

Activity的生命周期中怎么获取控件宽高?

onNewIntent的执行时机?

如何连续退出多个Activity?

如何把Acitivty设置成Dialog样式 ,android:theme="@android:style/ThemeDialog"

关于横竖屏切换的生命周期,对应不同的手机,由于厂商定制的原因,会有不同的效果,如设置了configChanges="orientation”在有些手机会执行各个生命周期,但有些手机却不会执行。

网上常见的结论如下:

但实际的测试如下:

可以看出,不同厂商的手机切屏生命周期会有差异。

从API 13以上,当设备在横竖切屏时,“屏幕尺寸”也会发生变化,因此为了杜绝切屏导致页面销毁重建,需要加上screenSize,使用设置4,即 android:configChanges="orientation|keyboardHidden|screenSize"

Activity的四种状态如下:

在activity处于paused或者stoped状态下,如果系统内存紧张,可能会被销毁,当重回该activity时会重建,正常返回和被回收后返回的生命周期如下:

如果是回收后返回,onCreate的参数savedInstanceState不为空。

有哪些场景会触发onNewIntent回调呢?跟启动模式有关,首先该Activity实例已经存在,再次启动才可能触发。一种情况是启动模式是singleTask或者singleInstance,无论该activity在栈中哪个位置,都会触发onNewIntent回调,并且把上面其他acitivity移除,另一种情况是启动模式是singleTop或者以FLAG_ACTIVITY_SINGLE_TOP启动,并且该activity实例在栈顶,会触发onNewIntent,如果不在栈顶是重新创建的,不会触发。

在实际业务开发中,往往碰到需要连续退出多个activity实例,下面整理了几种常见方法:

● 发送特定广播

1、在需要处理连续退出的activity注册该特定广播;

2、发起退出的activity发送该特定广播;

3、接收到该广播的activity 调用finish结束页面。

● 递归退出

1、用startActivityForResult启动新的activity;

2、前一个页面finish时,触发onActvityResult回调,再根据requestCode和resultCode处理是否finish,达到递归退出的效果。

● FLAG_ACTIVITY_CLEAR_TOP

通过intentsetFlag(IntentFLAG_ACTIVITY_CLEAR_TOP)启动新activity,如果栈中已经有该实例,则会把该activity之上的所有activity关闭,达到singleTop启动模式的效果。

● 自定义activity栈

1、自定义activity列表,新打开activity则加入栈中,关闭则移除栈;

2、需要退出多个activity时,则循环从栈中移除activity实例,并调用finish。

在讨论Activity启动模式经常提到任务栈,那到底什么是任务栈?

任务是一个Activity的集合,它使用栈的方式来管理其中的Activity,这个栈又被称为返回栈(back stack),栈中Activity的顺序就是按照它们被打开的顺序依次存放的。返回栈是一个典型的后进先出(last in, first out)的数据结构。下图通过时间线的方式非常清晰地向我们展示了多个Activity在返回栈当中的状态变化:

taskAffinity 任务相关性,可以用于指定一个Activity更加愿意依附于哪一个任务,在默认情况下,同一个应用程序中的所有Activity都具有相同的affinity, 名字为应用的包名。当然了,我们可以为每个 Activity 都单独指定 taskAffinity 属性(不与包名相同)。taskAffinity 属性主要和 singleTask 启动模式和 allowTaskReparenting 属性配对使用,在其他情况下没有意义。

taskAffinity 有下面两种应用场景:

分为显示启动和隐式启动。

(1)显示启动

直接指定待调整的Activity类名。

(2)隐式启动

Intent 能够匹配目标组件的 IntentFilter 中所设置的过滤信息,如果不匹配将无法启动目标 Activity。IntentFilter 的过滤信息有 action、category、data。

IntentFilter 需要注意的地方有以下:

● 一个 Activity 中可以有多个 intent-filter

● 一个 intent-filter 同时可以有多个 action、category、data

● 一个 Intent 只要能匹配任何一组 intent-filter 即可启动对应 Activity

● 新建的 Activity 必须加上以下这句,代表能够接收隐式调用

<category android:name="androidintentcategoryDEFAULT" />

只要匹配一个action即可跳转,注意的是action要区分大小写。

规则:如果intent中有category,则所有的都能匹配到intent-filter中的category,intent中的category数量可用少于intent-filter中的。另外,单独设置category是无法匹配activity的,因为category属性是一个执行Action的附加信息。

intent不添加category会匹配默认的,即 “android:intentcategoryDEFAULT”

如果上面例子,如果去掉intentsetAction("action_name"),则会抛出异常:

规则:类似action,但data有复杂的结构,只要匹配一个data并且与data中所有属性都一致就能匹配到Activity,只要有1个属性不匹配,都无法找到activity。

data的结构:

data 主要是由 URI 和 mimeType 组成的。

URI 可配置很多信息,的结构如下:

与url类似,例如:

mineType:指资源类型包括文本、、音视频等等,例如:text/plain、 image/jpeg、video/ 等

下面看下data匹配的例子:

只匹配scheme

只匹配scheme也是能匹配到activity的。

匹配scheme、host、port

将上面的data改为

匹配mineType

如果有mineType,则不能仅设置setData或setMineType了,因为setData会把mineType置为null,而setMineType会把data置为null,导致永远无法匹配到activity,要使用setDataAndType。

使用scheme的默认值content\file

注意该方法需要在startAtivity方法或者是finish方法调用之后立即执行,不能延迟,但可以在子线程执行。

而在windowAnimationStyle中存在四种动画:

activityOpenEnterAnimation // 打开新的Activity并进入新的Activity展示的动画

activityOpenExitAnimation // 打开新的Activity并销毁之前的Activity展示的动画

activityCloseEnterAnimation //关闭当前Activity进入上一个Activity展示的动画

activityCloseExitAnimation // 关闭当前Activity时展示的动画

overridePendingTransition的方式比较生硬,方法也比较老旧了,不适用于MD风格,google提供了新的转场动画ActivityOptions,并提供了兼容包ActivityOptionsCompat。

我们知道在onCreate和onResume里面直接获取到控件宽高为0,那有什么办法获取到控件的实际宽高?只要有onWindowFocusChanged、viewpost、ViewTreeObserver三种方式获取。

当用户点击桌面图标启动APP时,背后的流程如下:

我们看到的手机桌面是Launch程序的界面,点击应用图标会触发点击事件,调用startActivity(intent),然后通过Binder IPC机制,与ActivityManagerService(AMS)通讯,AMS执行一系列 *** 作,最终启动目前应用,大概流程如下:

通过PackageManager的resolveIntent()收集跳转intent对象的指向信息,然后通过grantUriPermissionLocked()方法来验证用户是否有足够的权限去调用该intent对象指向的Activity。如果有权限,则在新的task中启动目标activity,如果发现没有进程,则先创建进程。

如果进程不存在,AMS会调用startProcessLocked创建新的进程,在该方法中,会通过socket的通讯方式通知zygote进程孵化新的进程并返回pid,在新的进程中会初始化ActivityThread,并依次调用LooperprepareLoop()和Looperloop()来开启消息循环。

创建好进程后下一步要将Application和进程绑定起来,AMS会调用上一节创建的ActivityThread对象的bindAppliction方法完成绑定工作,该方法会发送一条BIND_APPLICATION的消息,最终会调用handleBindApplication方法处理消息,并调用makeApplication方法处理消息,加载APP的classes到内存中。

通过前面的步骤,系统已经拥有了该Application的进程,后续的启动则是从已存在其他进程中启动Acitivity,即调用realStartAcitvityLocked,该方法会调用Application的主线程对象ActivityThread的sheduleLaunchActivity方法,在方法中会发送LAUNCH_ACTIVITY到消息队列,最终通过handleLaunchActivity处理消息,完成Acitivty的启动。

Activity

Activity 的 36 大难点,你会几个?「建议收藏」

[译]Android Application启动流程分析

Intent可以翻译为意图,它负责对应用中 *** 作的动作及动作所涉及的数据进行描述,Android根据Intent的描述,找到相应的组件,将这个Intent传递给调用的组件,从而完成组件的调用。一个Intent对象其实就是信息的捆绑,它包含了接收该Intent的组件所需要的信息。通常,Intent对象包括如下的一些属性:

l 组件名称(ComponentName)

组件名称即为ComponentName对象,该对象包含了目标组件的类名和所属包名。组件名称是可选的,如果设定了的话,Intent对象会被传给指定类的一个实例。如果不设定,则Android使用其他信息来定位合适的目标。组件名称是使用setComponent(),setClass()或setClassName()来设定,使用getComponent()来获取。

l 动作(Action)

动作即为Intent要采取的行动。用一个字符串表示,Android提供了很多自带的动作,可以浏览网页、发送短信等,也可以自己定义Intent动作,要注意的是,要养成良好的习惯,用Java包名的命名方式来命名,因为系统要求动作名是独一无二的。

l 数据(Data)

即为动作要 *** 作的数据,Android中使用URI的方式来指定一个数据。例如,如果Action为ACTION_EDIT,那么Data将包含待编辑的数据URI。如果Action为ACTION_CALL,Data将为tel:电话号码的URI。如果Action为ACTION_VIEW,则Data为>

1、Intent对象详解

Android的应用程序包含三种重要组件:Activity、Service、BroadcastReceiver,应用程序采用一致的方式来启动它们----都是依靠Intent来进行启动的,Intent就封装了程序想要启动程序的意图,不仅如此,Intent还用于与被启动组件进行交换信息。

组件类型

启动方法

Activity

startActivity(Intent intent)

startActivityForResult(Intent intent,intrequestCode)

Service

ComponentName startService(Intent service)

boolean bindService(Intent service,ServiceConnection conn,int flags)

BroadcastReceiver

sendBroadcast(Intent intent)

sendBroadcast(Intent intent,String receiverPermission)

sendOrderedBroadcast(Intent intent,String receiverPermission,BroadcastReceiver resultReceiver,Handler scheduler,int initialCode,String initialData,Bundle initialExtras)

sendOrderedBroadcast(Intent intent,String receiverPermission)

sendStickyOrderedBroadcast(Intent intent,BroadcastReceiver resultReceiver,Handler scheduler,int initialCode,String initialData,Bundle initialExtras)

Intent对象大致包含Component、Action、Category、Data、Type、Extra和Flag这7种属性,其中Component用于明确指定需要启动的目标组件,而Extra则用于“携带”需要交换的数据。

2、Intent的属性及Intent-filter配置

(1)Component属性

Intent的Component属性需要接受一个ComponentName对象,应用程序可根据给定的组件类去启动特定的组件。

当程序通过Intent的Component属性(明确指定了启动哪个组件)启动特定组件时,被启动组件几乎不需要使用<intent-filter/>元素进行配置。

(2)Action、Category属性与intent-filter配置

Intent的Action和Category属性都是一个普通的字符串,其中Action代表该Intent所要完成的一个抽象“动作”,Category则用于为Action增加额外的附加类别信息,通常,Action与Category结合使用。

<intent-filter/>元素里通常可包括如下子元素:

a、0~N个<action/>子元素

b、0~N个<category/>子元素

c、0~1个<data/>子元素

<action/><category/>子元素的配置非常简单,它们都可指定android:name属性,该属性的值就是一个普通字符串。

当<activity/>元素里的<intent-filter/>子元素里包含多个<action/>子元素(相当于指定了多个字符串)时,就表明该Activity能响应Action属性值为其中任意一个字符串的Intent。

一个Intent对象最多只能包括一个Action属性,程序调用Intent的setAction(String str)方法来设置Action属性值;但一个Intent对象可包含多个Category属性,调用Intent的addCategory(String str)方法添加。

当程序创建Intent时,该Intent默认启动Category属性值为IntentCATEGORY_DEFAULT常量(常量值为androidintentcategoryDEFAULT)的组件。

(3)指定Action、Category调用系统Activity

实际上,Android内部提供了大量标准Action、Category常量,其中用于启动Activity的标准Action常量及对应的字符串如下:

Action常量

对应字符串

简单说明

ACTION_MAIN

androidintentactionMAIN

应用程序入口

ACTION_VIEW androidintentactionVIEW 显示指定数据

ACTION_ATTACH_DATA androidintentactionATTACH_DATA 指定某块数据将被附加到其它地方

ACTION_EDIT androidintentactionEDIT 编辑指定数据

ACTION_PICK androidintentactionPICK 从列表中选择某项并返回所选的数据

ACTION_CHOOSER androidintentactionCHOOSER 显示一个Activity选择器

ACTION_GET_CONTENT androidintentactionGET_CONTENT 让用户选择数据,并返回所选数据

ACTION_DIAL androidintentactionDIAL 显示拨号面板

ACTION_CALL androidintentactionCALL 直接向指定用户打电话

ACTION_SEND androidintentactionSEND 向其他人发送数据

ACTION_SENDTO androidintentactionSENDTO 向其他人发送消息

ACTION_ANSWER androidintentactionANSWER 应答电话

ACTION_INSERT androidintentactionINSERT 插入数据

ACTION_DELETE androidintentactionDELETE 删除数据

ACTION_RUN androidintentactionRUN 运行维护

ACTION_SYNC androidintentactionSYNC 执行数据同步

ACTION_PICK_ACTIVITY androidintentactionPICK_ACTIVITY 用于选择Activity

ACTION_SEARCH androidintentactionSEARCH 执行搜索

ACTION_WEB_SEARCH androidintentactionWEB_SEARCH 执行Web搜索

ACTION_FACTORY_TEST androidintentactionFACTORY_TEST 工厂测试的入口点

标准Category常量及对应的字符串如下:

Category常量

对应字符串

简单说明

CATEGORY_DEFAULT androidintentcategoryDEFAULT 默认的Category

CATEGORY_BROWSABLE androidintentcategoryBROWSABLE 指定该Activity能被浏览器安全调用

CATEGORY_TAB androidintentcategoryTAB 指定Activity作为TabActivity的Tab页

CATEGORY_LAUNCHER androidintentcategoryLAUNCHER Activity显示顶级程序列表中

CATEGORY_INFO androidintentcategoryINFO 用于提供包信息

CATEGORY_HOME androidintentcategoryHOME 设置该Activity随系统启动而运行

CATEGORY_PREFERENCE androidintentcategoryPREFERENCE 该Activity是参数面板

CATEGORY_TEST androidintentcategoryTEST 该Activity是一个测试

CATEGORY_CAR_DOCK androidintentcategoryCAR_DOCK 指定手机被插入汽车底座(硬件)时运行该Activity

CATEGORY_DESK_DOCK androidintentcategoryDESK_DOCK 指定手机被插入桌面底座(硬件)时运行该Activity

CATEGORY_CAR_MODE androidintentcategoryCAR_MODE 设置该Activity可在车载环境下使用

3、Data、Type属性与intent-filter配置

Data属性通常用于向Action属性提供 *** 作的数据,Data属性接收一个Uri对象,一个Uri对象通常通过如下形式的字符串表示:

content://comandroidcontracts/contacts/1

tel:123

上面两个字符串的冒号前面大致指定了数据的类型,冒号后面是数据部分。

Type属性则用于明确指定Data属性所指定数据的类型或MIME类型,当Intent不指定Data属性时Type属性才会起作用,否则Android系统将会根据Data属性值来分析数据的类型,因此无需指定Type属性。

一旦为Intent同时指定Action、Data属性,那么Android将可根据指定的数据类型来启动特定的应用程序,并对指定数据执行相应的 *** 作。下面介绍几个Action、Data属性的组合:

ACTION_VIEW content://comandroidcontacts/contacts/1:显示标识为1的联系人的信息

ACTION_EDIT content://comandroidcontacts/contacts/1:编辑标识为1的联系人的信息

ACTION_DIAL content://comandroidcontacts/contacts/1:显示向标识为1的联系人拨号的界面

ACTION_VIEW tel:123:显示向指定号码123拨号的界面

ACTION_DIAL tel:123:显示向指定号码123拨号的界面

ACTION_VIEW content://contacts/people/:显示所有联系人列表的信息,通过这种组合可以方便地查看系统联系人

4、Extra属性

Intent的Extra属性通常用于在多个Action之间进行数据交换,Intent的Extra属性值应该是一个Bundle对象,Bundle对象就像一个Map对象,它可以存入多组key-value对,这样可以就可以通过Intent在不同Activity之间进行数据交换了。

application/vndms-excel xls

audio/mpeg mp3

image/gif gif

image/jpeg jpg

application/msword doc

application/pdf pdf

1 隐式启动自己的活动

无论隐式启动自己的程序还是启动外部的程序,从原理上来说都是一致的

11 配置过滤器

111

每个activity都可以在清单文件中配置intent-filter,意图过滤器

112

在intent-filter中配置action,catagory,data,这三个参数用于过滤,即通过和这三个参数之间的匹配,确定要启动那个activity。

113

可以配置多个action,多个catagory,多个data。

如果显式启动程序,则不需要这三个参数,如果隐式启动程序,则至少需要一个action,一个catagory,data可以没有

114

action,和catagory中需要设置name,data主要可以设置scheme和mimetype,可以单独设置scheme或者单独设置mimetype,也可以既设置scheme,也设置mimetype。name,scheme,mimetype的值可以自己指定。

115

如果活动是主活动,即打开app自动启动的活动,则需要按下面的配置,格式是固定的,不能更改

如果活动不是主活动,而且需要隐式启动,则至少有一个action,名字随便,一个catagory 名字是androidintentcategoryDEFAULT。其他的各种参数没有强制规定。

具体的格式如下

12 启动活动

121 活动的响应

启动活动需要使用intent对象,intent中设置action,catagory,data,action和catagory就是intent中定义的相应的名字,data需要设置mimetype和scheme。

如果没有设置data

则只要intent中设置的action和catagory在intent-filter中配置的action和catagory中都有,相应的活动就可以响应。例如115中配置的intent-filter,假设它没有配置data,现在有一个intent,设置了action为comexamplezyl,catagory为androidintentcategoryDEFAULT那么这个活动就会被响应

如果设置了data

action和catagory匹配规则不变,intent中设置的对应data的参数(mimeType,scheme等)必须要匹配其中的任何一个data,也就是intent中设置的对应data参数必须和intent-filter中设置的data完全一致,才能被响应。还是上面中的那个例子,现在有一个intent,设置了action为comexamplezyl,catagory为androidintentcategoryDEFAULT,还需要设置data的mimetype为zzz,scheme为zyl,这个活动才能被响应

122 设置action

首先定义一个Intent对象,Intent是活动,广播,服务之前相互启动和通信的桥梁,并设置action,action就是zai有两种方式

第一种,直接在intent的参数中传入action

第二种,用setAction方法设置action

123 设置catagory

当要启动活动的时候,调用startActivity时,系统会自动为intent添加一个catagory属性,这个catagory属性的名字是androidintentcategoryDEFAULT。也就是说所有隐式启动的活动都会有这个catagory这个属性,这也就是为什么活动的intent-filter中必须配置androidintentcategoryDEFAULT这个属性。

所以,既然所有的intent-filter中都有androidintentcategoryDEFAULT这个属性,而启动活动时系统又会为intent添加这个属性,那么catagory这个属性就不用自己配置也会匹配的。

如果想要进一步过滤的话,也可以为intent继续设置catagory这个属性。设置的方法是

传入需要过滤的catagory的名字

124 设置data

如果intent-filter中没有设置data,那么上面两步就可以隐式的启动一个活动了,但是如果intent-filter中设置了data属性,那么如果想要启动那个活动,就必须为intent设置data。

这里只说两个比较重要的data的属性,scheme和mimetype

scheme

scheme通过setData设置

产生一个Uri对象,如下。调用Uriparse方法产生Uri对象,这个对象中传入一个字符串,中间用:分开,前面对应的就是scheme参数,这个scheme需要和intent-filter中配置的scheme一致,后面就是需要通过setData方法传入的参数。

然后

将Uri对象传入

mimeType

设置mimeType,如果intent-filter中设置了mimetype属性,则通过setType方法,为intent设置mimeType,这个mimeType需要和intent-filter中设置的mimeType一致,自己定义的mineType的格式必须满足 / 这种形式,代表任何字符。

------------------------------一个重要的问题-------------------------------------

如果在intent-filter中只设置scheme或者只设置了mimeType,则用上面的方法就可以了。

但是如果intent-filter中同时设置scheme和mimeType,那么就会产生一个问题,因为调用setData时会屏蔽setType,而setType时,会屏蔽setData。所以这时需要用一个方法,同时设置data和mimeType。这个方法叫setDataAndType,如下

-----------------------------另一个说明--------------------------------------------

setData有两个作用,一个作用是匹配scheme,另一个作用是传递数据。

调用setData时,可以指定scheme也可以不指定scheme,如果intent-filter中配置了scheme,可以在setData指定scheme,启动这个活动同时传递数据,如果intent-filter中没有指定scheme,在setData时,可以不指定scheme,只传递数据,例如下面这种写法,,也是可以的。对于setData传递数据这一块,在下面数据的传递那一块进行说明。

2 隐式启动其他的应用程序

通过和意图过滤器相互匹配就可以打开相应的活动,所以只要知道其他应用的意图过滤器是怎么配置的,自然就可以通过隐式启动的方法启动其他app中的活动

21 打电话

211 设置action

跳转到拨号界面,不直接拨打,对应的action为IntentACTION_DIAL,这个是系统封装好的字符串,对应拨号界面的action

直接拨打电话,对应的action为IntentACTION_CALL

或者

222 设置scheme

还需要设置scheme为tel

223 开启权限

要实现打电话功能,还需要在manifest中注册权限

224 开启活动

以上四步就实现了打电话的功能

22 发短信

221 设置action

222 传递要发送的联系人和设置scheme

223 传递要发送的短信内容

224 开启活动

以上四布就可以进入发送短信的界面,但是要手动发送短信,如果想直接发送短信,需要借助发送短信的manager类方法,详情在manager那部分写着

3 打开各种文件

对于手机中的各种文件,如果想调用相应的程序打开这些软件,就可以使用IntentACTION_VIEW,通过设置data传入数据内容,通过设置type筛选打开文件的程序的类型。这时就需要采用setDataAndType

例子如下

上面的例子就会调取可以打开这个文件的程序,供用户选择。

主要的就是设置数据和type,数据就直接从文件中读取就可以了,最重要的就是通过type来过滤应用程序。下面列出一个主要的mimeType类型

如果显式启动程序,那么不需要配置任何的intent-filter

直接在intent中传入当前活动的对象,和要打开的活动的class对象,然后开启活动即可

1 传递数据的方法

传递数据也通过intent,intent携带着数据,从一个活动,到另一个活动,传递数据有两种方法,一种是setData方法,一种是putExtra方法。无论是显式启动还是隐式启动,都可以调用这两种方法。

11 setData方法

111

在第一个活动中intent调用setData的方法,携带数据,传入一个Uri类型的数据,根据另一个活动中的相应配置,可以携带scheme参数,也可以不携带scheme参数

112

在另一个活动中接收数据

首先获取到传入的intent对象,然后通过getData()(返回一个Uri类型的数据),或者getDataString()(返回一直String类型的数据),如果传入的数据是一个String类型,则直接调用getDataString()就可以得到这个数据。

一般在自己的程序内部很少使用这种方式传递数据,当启动外部程序,外部程序又规定需要使用setData传递数据时,才会使用setData方式

12 putExtra方法

这种方法是传递数据最常用的方法

121 传递普通类型的数据

传入数据

获取数据

122 传递实体类对象的数据

想要传递实体类对象,首先创建实体类时要实现Serializable接口

现在准备实体类对象,和一个对象list

开始传递数据

第一种方式

传入数据时使用putExtra方式,即可以传入单个对象,也可以传入对象的list

获取数据

第二种方式

通过Bundle传递数据,同样既可以传入单个实体类对象,也可以传入实体类list

传入数据

接收数据

2 接收从下一个活动返回的数据

上面传递数据都是直接传递给下一个活动,现在想从下一个活动返回数据,启动活动是的方法就从startActivity变成了startActivityForResult

21 向下一个活动传递数据

22 下一个活动返回数据

23 第一个活动接收数据

想接收返回的数据,需要重写第一个活动的onActivityResult

以上就是关于android调用系统文件管理器不能只选择文件夹全部的内容,包括:android调用系统文件管理器不能只选择文件夹、getStringArray(String key) 的问题、android中intent的作用等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9595157.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-30
下一篇2023-04-30

发表评论

登录后才能评论

评论列表(0条)

    保存