允许其他应用启动自己应用的Activity

2016-07-09 · 🙈Lei · 0条 · 518次

要允许其他应用启动自己应用的Activity,需要在清单文件中为关联的Activity添加一个 <intent-filter> 元素。

当应用在某台设备上安装后,系统会确定应用的intent filters,并且将信息添加到一个可以被所有应用支持的内部目录。当一款应用通过隐式意图调用startActivity()或者startActivityForResult()时,系统会找到可以 相应该意图的所有activity。

>_ 添加意图过滤器

如果activity具有满足以下Intent对象条件的意向过滤器,系统可能向Activity发送给定的Intent.

操作(Action)

对要执行的操作(action)命名的字符串。通常是平台定义的值之一,比如ACTION_SEND、ACTION_VIEW.

通过<action>元素在意向过滤器中指定值。指定的值必须是action的完整的字符串名称,而不是API常量。

数据(Data)

与意图相关的数据描述。

用<data>元素在意向过滤器中指定值。通过使用此元素中的一个或者多个属性,可以指定仅仅MIME类型,URI前缀,URI架构或者这些或者其他值的组合来指明可以接受的数据类型。

注:如果不需要特别声明数据URI,例如activity处理其他额外数据而不是URI,那么你应该只需指定android:mimeType属性来表名activity处理的数据类型,例如text/plain或者image/jpeg。

类别(Category)

提供一个额外的方式表明activity可以处理的意图,通常跟用户手势和应用启动的位置有关。系统支持几种不同的类别,但是大多数很少使用。所有隐式意图默认都是用CATEGORY_DEFAULT定义。

用<category>元素在意图过滤器中指定值。

在意向过滤器中,您可以通过声明嵌套在<intent-filter>元素中的具有相应XML元素的各项,来声明您的activity接收的条件。

例: 在数据类型为文本或图像时处理 ACTION_SEND 意向的意向过滤器:

<activity android:name="ShareActivity">
<intent-filter>
<action android:name="android.intent.action.SEND"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="text/plain"/>
<data android:mimeType="image/*"/>
</intent-filter>
</activity>

每个入站意图仅指定一个action和一个data类型,但可以在一个<intent-filter>中声明<action><category><data>元素的多个实例。

如果任何两对action和data的行为相斥,您应创建单独的意向过滤器来指定与哪种数据类型配对时哪些操作可以被接收。

比如,您的activity同时处理ACTION_SEND和ACTION_SENDTO意图的文本和图像。在这种情况下,您必须为两个操作定义两种不同的意向过滤器,因为ACTION_SENDTO意向必须使用数据-URI指定使用send或sendto URI架构的收件人地址。

例:

<activity android:name="ShareActivity">

<!-- filter for sending text; accepts SENDTO action with sms URI schemes -->
<intent-filter>
<action android:name="android.intent.action.SENDTO"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="sms" />
<data android:scheme="smsto" />
</intent-filter>
<!-- filter for sending text or images; accepts SEND action and text or image data -->
<intent-filter>
<action android:name="android.intent.action.SEND"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:mimeType="image/*"/>
<data android:mimeType="text/plain"/>
</intent-filter>
</activity>

注:为了接收隐式意图,必须要在意图过滤器中包含CATEGORY_DEFAULT类别。如果声明了CATEGORY_DEFAULT类别,则startActivity()和startActivityForResult()可以处理所有意图。如果没有声明,activity将不能处理任何隐式意图。

>_ 在Activity中处理意图

为了决定在activity中采取何种操作,可以读取启动它的Intent。

当activity启动的时候,调用getIntent()检索启动activity的Intent。在Activity的整个生命周期中都可以这样做,但是你应该在比较早的回调中这样做,例如onCreate()或onStart().

例如:

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

setContentView(R.layout.main);

// Get the intent that started this activity
Intent intent = getIntent();
Uri data = intent.getData();

// Figure out what to do based on the intent type
if (intent.getType().indexOf("image/") != -1) {
// Handle intents with image data ...
} else if (intent.getType().equals("text/plain")) {
// Handle intents with text ...
}
}

>_ 返回值

如果你想要向调用你activity的activity返回结果,需要调用setResult()方法指定result code和结果意图。当你的操作完成,并且用户需要返回到之前的activity,调用finish()关闭当前activity()。

例:

// Create intent to deliver some kind of result data
Intent result = new Intent("com.example.RESULT_ACTION", Uri.parse("content://result_uri"));
setResult(Activity.RESULT_OK, result);
finish();

必须指定result code在结果中。通常来说,要么是RESULT_OK,要么是RESULT_CANCELED.必要的时候,可以用Intent提供额外数据。

注:默认结果被设置成RESULT_CANCELED。所以,如果在完成操作、你设置结果之前用户点击BACK按钮,之前的activity将会收到“canceled”结果。

如果您只需返回指示若干结果选项之一的整数,您可以将结果代码设置为大于 0 的任何值。 如果您使用结果代码传递整数,并且您无需包含 Intent,您可以调用 setResult() 并且仅传递结果代码。 例如:

setResult(RESULT_COLOR_RED);
finish();

在这种情况下,只有几个可能的结果,因此结果代码是一个本地定义的整数(大于 0)。 当您向自己应用中的Activity返回结果时,这将非常有效,因为接收结果的Activity可引用公共常数来确定结果代码的值。

注意:无需检查您的Activity是使用 startActivity() 还是 startActivityForResult() 开始的。如果开始您的Activity的意向可能需要结果,只需调用 setResult()。 如果原始Activity已调用startActivityForResult(),则系统将向其传递您提供给 setResult() 的结果;否则,会忽略结果。


  0