1.3.发出明确或隐含的意图
Android支持显式和隐式意图。应用程序可以在意图中直接定义目标组件(明确的意图)或者要求Android系统根据意向数据评估注册的组件(隐含意图 ).
Explicit意图使用Java类作为标识符,显式地定义Android系统应该调用的组件。显式意图通常在应用程序中使用,因为应用程序中的类由应用程序开发人员控制。下面展示了如何创建一个明确的意图并将其发送到Android系统以启动一个活动。
Intent i = new Intent(this, ActivityTwo.class);
i.putExtra("Value1", "This value one for ActivityTwo ");
i.putExtra("Value2", "This value two ActivityTwo");
隐式意图指定应该执行的操作和提供操作内容的可选数据。如果一个隐含的意图被发送到Android系统,它将搜索为特定动作和拟合数据类型注册的所有组件。如果只找到一个组件,Android会直接启动这个组件。如果Android系统识别出多个组件,用户将得到一个选择对话框,并可以决定哪个组件应该用于目的。
例如,下面的命令告诉Android系统查看一个网页。所有已安装的web浏览器都应该通过意向过滤器注册到相应的意向数据中。
Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.vogella.com/"));
startActivity(i);
1.4.确定有效的意向接收者
有时您需要确定组件是否已注册意向。例如,您希望检查某个意向接收器是否可用,如果某个组件可用,则在应用程序中启用一个功能。
可以通过PackageManager class
下面的示例代码检查组件是否注册了特定目的。构造您想要触发的意图,并将其传递给下面的方法。
public static boolean isIntentAvailable(Context ctx, Intent intent) {
final PackageManager mgr = ctx.getPackageManager();
List<ResolveInfo> list =
mgr.queryIntentActivities(intent,
PackageManager.MATCH_DEFAULT_ONLY);
return list.size() > 0;
}
根据结果你可以调整你的申请。例如,可以禁用或隐藏某些菜单项。
1.5.意图作为事件触发器
意图可以用来向Android系统发送广播消息广播接收机可以注册到事件,并在发送此类事件时收到通知。
您的应用程序可以注册到系统事件中,例如,新邮件已到达、系统启动完成或收到电话呼叫并做出相应反应。
2.活动之间的数据传输
2.1.数据传输到目标组件
意图包含某些头数据,例如所需的操作、类型等。可选地,意图还可以包含基于Bundle类,该类可以通过 getExtras()方法
也可以将数据直接添加到Bundle通过超载 putExtra()方法Intent object。附加项是键/值对。类型始终是字符串。作为值,可以使用基元数据类型(int ,float, …) plus类型的对象String ,Bundle ,Parcelable和可序列化 .
接收组件可以通过Intent object上的getAction ( )和getData ( )方法访问这些信息。这个Intentobject可以通过getIntent ( )方法进行检索。
接收意图的组件可以使用getIntent().getExtras()方法调用以获取额外数据。下面的代码片段演示了这一点。
Bundle extras = getIntent().getExtras();
if (extras == null) {
return;
}
// get data via the key
String value1 = extras.getString(Intent.EXTRA_TEXT);
if (value1 != null) {
// do something with the data
}
2.2.从子活动中检索结果数据
活动可以通过手机上的后退按钮关闭。在这种情况下finish()方法被执行。如果活动是用startActivity(Intent)方法调用时,调用方不需要来自现在已关闭的活动的结果或反馈。
如果你用startActivityForResult()方法调用时,需要子活动提供反馈。子活动结束后onActivityResult()你可以根据结果调用sub actions。
在startActivityForResult()方法调用您可以指定一个结果代码来确定您启动了哪个活动。此结果代码将返回给您。已启动的活动还可以设置一个结果代码,调用者可以使用该代码来确定活动是否已取消。
子活动使用finish()方法来创建新的意图并将数据放入其中。它还通过setResult()方法调用
下面的示例代码演示如何触发意图和startActivityForResult()方法
public void onClick(View view) {
Intent i = new Intent(this, ActivityTwo.class);
i.putExtra("Value1", "This value one for ActivityTwo ");
i.putExtra("Value2", "This value two ActivityTwo");
// set the request code to any code you like,
// you can identify the callback via this code
startActivityForResult(i, REQUEST_CODE);
}
如果你使用startActivityForResult()方法,然后开始活动被称为子活动 .
如果子活动完成,它可以通过意图这是在finish()方法
@Override
public void finish() {
// Prepare data intent
Intent data = new Intent();
data.putExtra("returnKey1", "Swinging on a star. ");
data.putExtra("returnKey2", "You could be better then you are. ");
// Activity finished ok, return the data
setResult(RESULT_OK, data);
super.finish();
}
子活动完成后onActivityResult()调用中的方法活动被称为
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK && requestCode == REQUEST_CODE) {
if (data.hasExtra("returnKey1")) {
Toast.makeText(this, data.getExtras().getString("returnKey1"),
Toast.LENGTH_SHORT).show();
}
}
}
3.通过意向过滤器注册意向
意图是用来向Android系统发出某种事件已经发生的信号。意图通常描述应该执行的操作,并提供执行该操作的数据。例如,您的应用程序可以通过intent为某个URL启动浏览器组件。下面的例子说明了这一点。
String url = "https://www.vogella.com/";
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(url));
startActivity(i);
但是Android系统如何识别能够对某种意图做出反应的组件呢?
组件可以通过意向过滤器对于特定的操作和特定的数据。意图过滤器指定活动、服务或广播接收器可以通过声明组件的功能来响应的意图类型。
Android组件在 AndroidManifest.xml或者在广播接收器的情况下也可以通过代码动态地进行。它的数据由一个意图过滤器定义。它也可以包含额外的元数据。
如果一个意图被发送到Android系统,Android平台将运行一个接收器确定。它使用意图中包含的数据。如果多个组件注册了同一个意图过滤器,用户可以决定应该启动哪个组件。
您可以通过意向过滤器为某些事件注册Android组件。如果一个组件没有定义一个组件,它只能通过显式意图调用。本章提供了一个注册意图组件的示例。注册的关键是组件注册正确的操作、mime类型并指定正确的元数据。
如果您将这样的意图发送到您的系统,Android系统将为该意图确定所有注册的Android组件。如果已经为此目的注册了多个组件,则用户可以选择应该使用哪个组件。
3.1.示例:将活动注册为浏览器
以下代码将注册活动对于意图当有人想打开一个网页时会触发。
<activity android:name=".BrowserActivitiy"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="http"/>
</intent-filter>
</activity>
3.2.示例:为共享意向注册活动
以下示例为注册活动ACTION_SEND意图。它声明自己只与文本/纯文本mime类型
<activity
android:name=".ActivityTest"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.SEND" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain" />
</intent-filter>
</activity>
如果组件未定义意图过滤器,则只能通过显式意图调用它。
来自:https://www.vogella.com/tutorials/AndroidIntent/article.html#starting-activities-or-services
最后
如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。此外,良好的职业规划也很重要,学习的习惯很重要,但是最重要的还是要能持之以恒,任何不能坚持落实的计划都是空谈。
如果你没有方向,这里给大家分享一套由阿里高级架构师编写的《Android八大模块进阶笔记》,帮大家将杂乱、零散、碎片化的知识进行体系化的整理,让大家系统而高效地掌握Android开发的各个知识点。
相对于我们平时看的碎片化内容,这份笔记的知识点更系统化,更容易理解和记忆,是严格按照知识体系编排的。