时间:2012/11/19
书籍:Beginning.Android.4.Application.Development
开发环境:eclipse
1.深入了解intent对象。
--这里为intent对象进行一点总结。
(1)用intent对象可以开始新的活动。
startActivity(new Intent(“net.learn2develop.SecondActivity”));
只需要提供活动的intent-filter name即可,但如果活动就在本项目内,也可以:
startActivity(new Intent(this, SecondActivity.class));
也可以同时传递活动的intent-filter name 和数据:
Intent i = new
Intent(android.content.Intent.ACTION_VIEW,
Uri.parse(“http://www.amazon.com”));
startActivity(i);
传入的data是为了让活动使用的,也可以分开构造intent对象和传入数据,用setdata方法:
Intent i = new
Intent(“android.intent.action.VIEW”);
i.setData(Uri.parse(“http://www.amazon.com”));
这里,提供的数据意味着动作想要浏览网页,安卓os会自动寻找能满足需求的应用来执行动作。这个过程称为:intent resolution。有些intent对象也可以不指定传入的数据类型,例如要到联系人列表选择一个联系人:
Intent i = new
Intent(android.content.Intent.ACTION_PICK);
i.setType(ContactsContract.Contacts.CONTENT_TYPE);
只需要传入一个MIME type(媒体类型格式)就可以。
总结:一个intent对象可以包含如下数据:
Action,Data,Type,Category(以后讨论)。
2.使用intent-filter。
--这里介绍关于intent-filter的更多内容。在新建活动时,我们需要在主项目的Manifest文件中加入一个Activity标签并加入新活动的内容:
<activity android:name=”.MyBrowserActivity”
android:label=”@string/app_name”>
<intent-filter>
<action android:name=”android.intent.action.VIEW” />
<action android:name=”net.learn2develop.MyBrowser” />
<category android:name=”android.intent.category.DEFAULT” />
<data android:scheme=”http” />
</intent-filter>
</activity>
注意几点:
(1)在intent-filter元素里面,定义了两个action标签。
两个action意味着这个别的活动要调用这个活动,要么以android.intent.action.VIEW名字要么net.learn2develop.MyBrowser(这个活动在本项目中)名字.
(2)有一个Category元素。
如果活动想要用startActivity或者startActivityForResult等调用别的活动的话,那被调用活动就应该指定这个属性为android.intent.category.DEFAULT.否则以上行为则不被允许。
(3)一个data属性。
data属性指定了以上可被调用活动所期望的数据,这里是以“http://”开头的数据。
(4)注意当用:
Intent i = new
Intent(android.content.Intent.ACTION_VIEW,
Uri.parse(“http://www.amazon.com”));
来调用活动的时候,系统会多个(如果有)提供符合这个要求的应用来给用户选择。
(5)也可以自定义选择框的题头:
Intent i = new
Intent(android.content.Intent.ACTION_VIEW,
Uri.parse("http://www.amazon.com"));
startActivity(Intent.createChooser(i, "Open URL using..."));
这样就可以指定用户选择时候所看见的提示信息了。3.增加目录
--可以将活动以目录的形式归类。例如可以将上面的intent-filter改成:
<intent-filter>
<action android:name=”android.intent.action.VIEW” />
<action android:name=”net.learn2develop.MyBrowser” />
<category android:name=”android.intent.category.DEFAULT” />
<category android:name=”net.learn2develop.Apps” />
<data android:scheme=”http” />
</intent-filter>
在这个情况下,如下代码会直接调用MyBrowerActivity(而不会提供选择)。Intent i = new
Intent(android.content.Intent.ACTION_VIEW,
Uri.parse(“http://www.amazon.com”));
i.addCategory(“net.learn2develop.Apps”);
startActivity(Intent.createChooser(i, “Open URL using...”));
当去掉了addCategory(“net.learn2develop.Apps”)这个属性后,系统会提供选择的余地,因为MyBrowserActivity也在android.intent.category.DEFAULT目录下。但是如果增加一个调用活动不匹配的项目,则没有活动会被调用,在这里MyBrowserActivity符合两个目录1.android.intent.category.DEFAULT,2.net.learn2develop.Apps.但如果加入一下代码:
Intent i = new
Intent(android.content.Intent.ACTION_VIEW,
Uri.parse(“http://www.amazon.com”));
//i.addCategory(“net.learn2develop.Apps”);
//---this category does not match any in the intent-filter---
i.addCategory(“net.learn2develop.OtherApps”);
startActivity(Intent.createChooser(i, “Open URL using...”));
因为net.learn2develop.OtherApps不匹配intent-filter内的任何活动,所以一个异常会被抛出。但是如果在活动的intent-filter标签里增加一行:
<category android:name=”net.learn2develop.OtherApps” />
那么这个活动就会正常被调用。
一个intent对象也可以添加多个Category:
Intent i = new
Intent(android.content.Intent.ACTION_VIEW,
Uri.parse(“http://www.amazon.com”));
//i.addCategory(“net.learn2develop.Apps”);
//---this category does not match any in the intent-filter---
i.addCategory(“net.learn2develop.OtherApps”);
i.addCategory(“net.learn2develop.SomeOtherApps”);
startActivity(Intent.createChooser(i, “Open URL using...”));
总结:一个活动可以属于多个Category里面,而当要调用活动的时候,活动必须匹配intent-filter的所有Category,如果活动的Category不全匹配上intent的Category,活动就不会被调用。而默认的目录就是android.intent.category.DEFAULT .当满足intent-filter需求的活动有一个以上的时候,系统会给用户选择要调用哪个。
3.打印提示信息(NOTIFICATIONS)。
--toast信息是比较方便的提示信息,但是它只会在屏幕上逗留几秒,当要提示用户重要信息的时候,应该用NotificationManager。
(1)首先要声明一个intent对象,指明点击Notification时候要调用的活动:
Intent i = new Intent(this, NotificationView.class);
i.putExtra(“notificationID”, notificationID);
这里当用户点击Notification的时候,NotificationView活动就会被调用。这里加入了额外的数据NotificationID(int类型),用来识别点击的是哪个Notification。
(2)还需要一个PendingIntent,用于在迟些时候执行一个动作(提示会议等等)。
PendingIntent pendingIntent =
PendingIntent.getActivity(this, 0, i, 0);
在这里PendingIntent.getActivity传入三个参数并返回一个PendingIntent对象。1.content(this)-->用来指定该动作是由那个活动执行的,2.request code(0)-->intent对象的requestcode,3.Intent(i)-->用于调用活动的intent对象。4.flags(0)-->活动载入时候的标志。
(3)然后获取一个NotificationManager和创建一个Notification实例。
NotificationManager nm = (NotificationManager)
getSystemService(NOTIFICATION_SERVICE);
Notification notif = new Notification(
R.drawable.ic_launcher,
“Reminder: Meeting starts in 5 minutes”,
System.currentTimeMillis());
Notification类用于指定Notification第一次在status bar出现时候的消息内容,第二个参数用于设定在statusbar 的ticker text。
(4)然后用setLatestEventInfo()方法来设定Notification的细节:
CharSequence from = “System Alarm”;
CharSequence message = “Meeting with customer at 3pm...”;
notif.setLatestEventInfo(this, from, message, pendingIntent);
//---100ms delay, vibrate for 250ms, pause for 100 ms and
// then vibrate for 500ms---
notif.vibrate = new long[] { 100, 250, 100, 500};
这里的setLatestEventInfo方法from和message(CharSequence类型)设定了下拉菜单中该Notification的信息(前面是题头,后面是内容),然后PendingIntent则是设定了用户点击Notification时候所调用的活动(在上面几步中设置好在PendingIntent对象中)。(5)最后用NotificationManager的notify方法调用Notification:
nm.notify(notificationID, notif);
(6)最后用cancel来取消Notification。
//---look up the notification manager service---
NotificationManager nm = (NotificationManager)
getSystemService(NOTIFICATION_SERVICE);
//---cancel the notification that we started---
nm.cancel(getIntent().getExtras().getInt(“notificationID”));
由于指定了点击Notification的调用活动,故当用户点击Notification的时候,该活动会被调用。这是Notification可以被取消,这里用NotificationManager的cancel方法。传入Notification的id,用于取消相应的Notification。这几个步骤有点含糊,书上也没讲清楚。。晕。