长按通知以后进入自定义设置页面
<activity android:name="SettingsActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name=
"android.intent.category.DEFAULT" />
<category android:anme=
"android.intent.category.NOTIFICATION_PREFERENCES" />
</intent-filter>
</activity>
作者顺便推广了一把通过 PreferenceFragment
与 Preference xml
很简单就实现一个设置页面.
Add more actionable button on Notification
new NotificationCompat.Builder(this)
.setSamllIcon(...)
.setContentTitle(title)
.setContentText(text)
.addAction(R.drawable.ic_answer,
getString(R.string.call_answer),
answerPendingIntent)
.addAction(R.drawable.ic_ignore,
getString(R.string.call_ignore),
ignorePendingIntent)
.build();
new Notification.Builder(this)
.setSmallIcon(...)
.setContentTitle(title)
.setContentText(text)
// started in Jelly Bean
.setStyle(
new Notification.BigPictureStyle()
.bigPicture(photoBitmap))
.build();
// rich text?
.setStyle(
new Notification.BigTextStyle()
.bigText(longText))
.build();
多端同步,如果一端的notification被干掉,同步到其他端也将其干掉。
onGoing Notification
用户无法划掉
- startForeground()
- incoming calls
- prefer snooze-and-repost pattern
需要给用户可以划掉/干掉的机会
如:音乐播放器在播放的时候无法划掉,在暂停/停止的时候,允许用户划掉(改优先级)(Google Music目前的做法)如: SSH/VPN连接在连接上的时候无法划掉,但是提供Action断开链接就自动干掉
IV. Delight the user
两种用户:
- 从来都不开声音,要不只开振动
- 始终都开通知声音,并且喜欢去设置声音类型针对不同的应用
设置通知声音
<RingtonePreference
android:persistent="true"
android:key="sms_sound"
android:denpendency="sms_enable"
android:ringtoneType="notification"
android:title="@string/sms_sound" />
SharedPreferences prefs = PreferenceManager
.getDefaultSharedPreferences(context);
String url = prefs.getString(SOUND, null);
if(uri != null){
builder.setSound(Uri.parse(uri));
}
V. Connect them to the people they love
系统提供指定联系人(星标) ,其余联系人不打扰的模式,因此我们可以在不请求获取联系人权限的情况下通过以下的方式进行对通知绑定
new Notification.Builder(this)
.setSmallIcon(...)
.setLargeIcon(...)
.setContentTilte(senderName)
.setContentText(msgText)
.addAction(...)
.addPerson(Uri.fromParts("mailto",
"igzhenjie@gmail.com", null)
.toString())
.build();
// tel
.addPerson(Uri.fromParts("tel",
"1(617) 555-1212", null)
.toString())