Android开发指南

正文实例陈说了Android不使用自定义布局意况下促成自定义布告栏Logo的方式。分享给大家供我们参谋,具体如下:

 

自定义通告栏Logo?不是很简短么。自定义架构都不言而喻!

前言

是的,有xml布局文件当然整个都很粗大略,若是不给你布局文件用吧?

  本章内容为Android开辟者指南的 Framework Topics/User
Interface/Notifications/Status Bar
Notifications章节,译为”状态栏文告”,版本为Android 4.0
r1,翻译来自:”呆呆大虾”,招待访谈他的博客园:””,再次多谢”呆呆大虾”
!期望您一齐加入翻译Android的连带资料,联系作者over140@gmail.com。

听我稳步道来!

 

率先怎么开创四个通报呢?
1.new 一个

声明

复制代码 代码如下:

  应接转载,但请保留文章原本出处:卡塔尔 

Notification n = new Notification(android.R.drawable.ic_menu_share,
null, System.currentTimeMillis());

    博客园:

参数:Logo ID,发送到状态栏须臾间的文字,当前岁月

    Android汉语翻译组:

2.安装详细信息:标题、内容、intent

 

PendingIntent contentIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
n.setLatestEventInfo(this, "早上好!", "今天是个晴朗的天气!", contentIntent);

 

3.发送到公告栏

事态栏文告

NotificationManager mNM = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mNM.notify(1001, n);

翻译具名:
呆呆大虾

这般就成功了三个通报的彰显,非常轻易!

翻译和讯:

我们来拜访 n.setLatestEventInfo 干了些什么呢

版本:Android 4.0
r1

public void setLatestEventInfo(Context context, 
  CharSequence contentTitle, CharSequence contentText, PendingIntent contentIntent) {
 // TODO: rewrite this to use Builder
 RemoteViews contentView = new RemoteViews(context.getPackageName(), 
   R.layout.notification_template_base);
 if (this.icon != 0) {
  contentView.setImageViewResource(R.id.icon, this.icon);
 }
 if (priority < PRIORITY_LOW) {
  contentView.setInt(R.id.icon, 
    "setBackgroundResource", R.drawable.notification_template_icon_low_bg);
  contentView.setInt(R.id.status_bar_latest_event_content, 
    "setBackgroundResource", R.drawable.notification_bg_low);
 }
 if (contentTitle != null) {
  contentView.setTextViewText(R.id.title, contentTitle);
 }
 if (contentText != null) {
  contentView.setTextViewText(R.id.text, contentText);
 }
 if (this.when != 0) {
  contentView.setViewVisibility(R.id.time, View.VISIBLE);
  contentView.setLong(R.id.time, "setTime", when);
 }
 if (this.number != 0) {
  NumberFormat f = NumberFormat.getIntegerInstance();
  contentView.setTextViewText(R.id.info, f.format(this.number));
 }
 this.contentView = contentView;
 this.contentIntent = contentIntent;
}

原文

能够看来,他其实正是行使系统暗中同意结构为大家创建了贰个 RemoteViews
,RemoteViews 是专门用来跨进度展现的
View
,详细情形参见官方文书档案:

        

看这句:

 

复制代码 代码如下:

连忙查看

contentView.setImageViewResource(R.id.icon, this.icon);

·           
状态栏(status
bar)布告允许应用程序以不苦恼当前activity的章程将事件通报客户。

实际正是安装Logo了:

·           
能够给布告绑定二个意向(intent),当客商点击时系统会举办此策动。

参数1:用来显示Logo的 ImageView 的 id
参数2:图标 id

在本文中

但是还恐怕有二个那样的法子:

底蕴知识

复制代码 代码如下:

管住布告

RemoteViews.setImageViewBitmap(int viewId, Bitmap bitmap)

制造公告

用 Bitmap 来安装图标。

更新文告

而 Notifycation
里面有个参数:Notification.contentView,稳重看,setLastestEventInfo
方法里创立的 RemoteViews 就是她,所以您明白该如何是好了!

足够声音

唯独此地还有一个难点?奥迪Q3.id.icon 怎么获取,那些事物其实在
com.android.internal.Tiggo 那几个里面,不过那么些类大家拜会不到怎么办?

增加振动

反射呗, Java 的反光可谓是万能呀,啥都得以得到假设她在。

丰富闪亮

Class<?> clazz = Class.forName("com.android.internal.R$id"); 
 Field field = clazz.getField("icon"); 
 field.setAccessible(true); 
 int id_icon = field.getInt(null); 



n.setLatestEventInfo(context, title, msg, contentIntent);
n.flags |= Notification.FLAG_AUTO_CANCEL;
if(n.contentView != null && icon != null){
 n.contentView.setImageViewBitmap(id_icon, icon);
}

其余特色

发出通知,下拉通知栏看看,Logo是或不是变了^_^

创办自定义的张开View

除此以外这里还有三个小细节,正是你 new
Notifycation(卡塔尔国 是传进去的图标会作为状态栏的小Logo,小Logo尺寸在 hdpi
上边放 32×32 的就能够

关键类

图片 1

Notification

于是您能够率先次传小Logo,然后通过 contentView 设置大Logo,那样就OK了

NotificationManager

图片 2

 

可望本文所述对我们Android程序设计有着扶助。

状态栏(status
bar)公告将三个Logo填加到系统的场馆栏中(包涵一条可选的提示文本音讯),并将一条举办新闻增添到通告窗口中。当客户选中张开信息时,Android将实行一个此布告已定义的来意Intent(日常用于弹出一个Activity)。你还是能对通报进行陈设,用配备提供的声响、振动、闪光来提示客商。

你恐怕感兴趣的篇章:

  • android达成公告栏下载更新app示例
  • Android完毕沉浸式文告栏通告栏背景颜色跟随app导航栏背景颜色而改动
  • android中开创文告栏Notification代码实例
  • Android程序版本更新之文告栏更新下载安装
  • Android开采之禁绝下拉通告栏的办法
  • Android音讯文告栏的达成情势介绍
  • Android开荒之使用文告栏显示提示音信的艺术
  • Android达成通告栏透明的情势
  • Android编制程序获取文告栏中度的办法
  • Android获取常用协助方法(获取显示屏中度、宽度、密度、文告栏中度、截图卡塔尔(英语:State of Qatar)
  • android布告栏的贯彻方式解析
  • Android项目仿UC浏览器和360有线电话卫士新闻常驻栏(通告栏)
  • Android编制程序之文告栏的用法小结

 

当后台服务(Service)需求对有个别事件产生提示况且需求客商响合时,状态栏文告就能够发挥效率了。后台服务没有会起步Activity来选取客户的互相,代替他的是相应创立一个动静栏通告,在客户点选后再由文告来运维Activity。

 

以下截图彰显了三个侧边带有文告Logo的状态栏:

图片 3

 

下图显示了“Notifications”窗口内的关照实行新闻。用户可因此下拉状态栏(或在Home菜单里选中通知)来彰显这些通告窗口。

图片 4

 

 

根底知识

Activity或者Service都能开端化五个气象栏布告。可因为Activity独有在活动状态并赢得宗旨时技艺推行操作,所以照旧提出用Service来创设状态栏文告。那样,纵然用户正在接纳其余程序照旧道具已经休眠时,如故能够从后台创造公告。要创造三个文告,须用到八个类:Notification类和NotificationManager类。

用Notification类的二个实例来定义状态栏文告的属性,譬喻图标、张开信息,以至播放声音等附属设置。NotificationManager是二个Android系统服务,用于管理和平运动作具有文告。NotificationManager无法被实例化,为了把Notification传给它,你能够用getSystemService()艺术获得三个NotificationManager的援引。在急需文告客商时再调用notify()主意将Notification对象传给它。

 

要成立叁个景色栏布告:

1.        
获取NotificationManager的引用:

String
ns =
Context.NOTIFICATION_SERVICE; 

NotificationManager
mNotificationManager =
(NotificationManager)
getSystemService(ns);

2.        
实例化Notification:

int
icon =
R.drawable.notification_icon; 

CharSequence
tickerText =
“Hello”; 

long

when

System.currentTimeMillis(); 

Notification
notification =
new
Notification(icon,
tickerText,
when);

3.        
钦命通告的展开音信和Intent:

Context
context =
getApplicationContext(); 

CharSequence
contentTitle =
“My
notification”; 

CharSequence
contentText =
“Hello
World!”; 

Intent
notificationIntent =
new
Intent(this,
MyClass.class); 

PendingIntent
contentIntent =
PendingIntent.getActivity(this,
0,
notificationIntent,
0); 

notification.setLatestEventInfo(context,
contentTitle,
contentText,
contentIntent);

4.        
将Notification对象传给NotificationManager:

private
static
final
int
HELLO_ID =
1;  

mNotificationManager.notify(HELLO_ID,
notification);

好了,今后客商已经能收看布告了。

 

 

治本公告

系统服务NotificationManager治本着具备的通告,只好通过getSystemService()艺术来博取它的援引。举例:

String
ns =
Context.NOTIFICATION_SERVICE; 

NotificationManager
mNotificationManager =
(NotificationManager)
getSystemService(ns);

生机勃勃旦想要发送状态栏公告,通过notify(int,
Notification)传递Notification对象给NotificationManager就可以。第叁个参数是Notification
的唯意气风发ID,第一个参数是Notification对象。ID在漫天应用程序范围内唯大器晚成标记Notification。Notification要求创新;应用程序恐怕管理着两种不一致的打招呼,在顾客通过独家定义的Intent再次来到应用程序时必须能选拔正确的动作施行之,由此上述参数是必需的。

要兑现客户从布告窗口内点选后自动毁灭状态栏文告,请在Notification对象中插足“FLAG_AUTO_CANCEL”标识。也得以流传通知ID用cancel(int)手动消灭,大概用cancelAll()撤除全数你创立的照拂。

 

 

开创文告

Notification对象定义了通报音信彰显在状态栏和文告窗口上的细节内容,以致其余提示设置(举例:声音、闪光等)。

 

情形栏公告必须蕴含以下内容:

·      
状态栏Logo

·      
打开窗口view的标题和拓宽音讯(除非用了自定义张开view)

·      
PendingIntent,当布告被点选时进行

 

场合栏通知的可选设置囊括:

·      
状态栏提醒音讯

·      
提示声音

·      
震撼设置

·      
LED灯闪光设置

 

Notification的底工库(翻译注:原作是starter-kit,但总结上下文实际不是“初读书人套件”的情趣,这里译为根基库)里含有了布局方法Notification(int,
CharSequence,
long)和setLatestEventInfo(Context,
CharSequence, CharSequence,
PendingIntent)方法。那早就得以定义Notification的保有安装。以下代码段演示了对通报中央的安装:

int
icon =
R.drawable.notification_icon;
       //
icon from resources 

CharSequence
tickerText =
“Hello”;
             //
ticker-text 

long

when

System.currentTimeMillis();
        //
notification time 

Context
context =
getApplicationContext();
     //
application Context 

CharSequence
contentTitle =
“My
notification”; //
expanded message title 

CharSequence
contentText =
“Hello
World!”;
     //
expanded message text 

 

Intent
notificationIntent =
new
Intent(this,
MyClass.class); 

PendingIntent
contentIntent =
PendingIntent.getActivity(this,
0,
notificationIntent,
0); 

 

//
the next two lines initialize the Notification, using the configurations
above 

Notification
notification =
new
Notification(icon,
tickerText,
when); 

notification.setLatestEventInfo(context,
contentTitle,
contentText,
contentIntent);

 

履新布告

应用程序能够在事变正在实行时更新境况栏布告。比方,前一条短信尚未读,可又来了一条新短信,短信程序为了科学展现未读短信的总额,能够修改已有些通告。当时,更新原有公告要比向NotificationManager新添一条公告更客观些,因为幸免了公告窗口的突显混乱。

因为NotificationManager对各类文告都用一个子弹头ID举行了唯风华正茂标记,新的通报内容能够用setLatestEventInfo()办法方便地开展修改,然后重新调用notify()来得出来。

而外Context、展开音讯的标题和文件外,能够使用对象的成员值改良种种属性。要更改公告的文本音讯,只能对contentTitlecontentText参数赋新值并调用setLatestEventInfo(),然后再调用notify()形式来更新布告。(当然,如果已经创办了自定义增加view,那么标题和文书的改作育不算了)。

 

拉长声音

能够用缺省提示音(由客商钦赐)只怕程序内定声音来唤起客户。

要利用顾客缺省提醒音,给defaults个性增添“DEFAULT_SOUND”:

notification.defaults
|=
Notification.DEFAULT_SOUND;

 

要使用应用程序内定的声息,则传递四个Uri援用给sound天性。以下例子使用已保存在设备SD闪存卡上的音频文件作为提示音:

notification.sound

Uri.parse(“file:///sdcard/notification/ringer.mp3”);

 

在底下的例子里,音频文件从里头MediaStore类的ContentProvider中获取:

notification.sound

Uri.withAppendedPath(Audio.Media.INTERNAL_CONTENT_URI,
“6”);

那儿,已知有财富ID为6的媒体文件,况兼已增多到Uri剧情中。假设不明了适当的ID,则必得先用ContentResolver询问MediaStore中有着可用的能源。关于使用ContentResolver的详细消息请参阅Content
Providers文档。

万一指望在顾客响应通告或吊销通告前,声音平昔持续循环播放,能够把
“FLAG_INSISTENT” 加入flags属性中。

注意:如果defaults品质包涵了“DEFAULT_SOUND”,则缺省提示音将覆盖sound
属性里钦命的响声。

 

累积振动

能够用缺省震憾格局或程序钦定的振动情势来唤醒客户。

要用缺省震撼形式,给属性defaults
添加“DEFAULT_VIBRATE”
即可:

notification.defaults
|=
Notification.DEFAULT_VIBRATE;

要自定义震撼情势,须给vibrate属性传递二个long
类型的数组:

long[]
vibrate =
{0,100,200,300}; 

notification.vibrate

vibrate;

长整型数组定义了震憾开和关轮番的小时(微秒)。第三个数是发端颠荡前的等待时间(震憾关闭),第叁个数是率先次拉开振动的持续时间,第多个数是下一遍关闭时间,如此类推。振动方式的持续时间未有范围,但不能够安装为再一次振动。

注意:如果defaults
属性包含了“DEFAULT_VIBRATE”,则缺省的触动情势将会覆盖vibrate
属性里钦赐的情势。

 

增进闪耀

要想用LED闪光来唤醒顾客,能够实行缺省闪亮形式(固然可用的话),也能够自定义闪光的颜色和格局。

要利用缺省的闪亮设置,给属性defaults
添加“DEFAULT_LIGHTS”即可:

notification.defaults
|=
Notification.DEFAULT_LIGHTS;

 

要自定义颜色和情势,则须钦命ledARGB属性(指颜色)、ledOffMS天性(闪光关闭皮秒数)、ledOnMS特性(闪光开启纳秒数),并在“flags”属性里投入“FLAG_SHOW_LIGHTS”:

notification.ledARGB

0xff00ff00; 

notification.ledOnMS

300; 

notification.ledOffMS

1000; 

notification.flags
|=
Notification.FLAG_SHOW_LIGHTS;

上例实现了朱红光闪烁300纳秒间歇1秒的闪亮。每一个设备的LED灯不可能扶植具有颜色的发光,区别的装置所能扶植的颜料也各不相近,因而硬件将坚决守护最贴近的水彩来发光。蓝绿是最广泛的提示色。

 

别的特色

行使Notification的品质和标识位,能够给布告增加越多的特征。

上面列出了中间黄金时代部分常用的特色:

“FLAG_AUTO_CANCEL”标志

flags质量中增添此标识,则在布告窗口点选后能活动撤销公告。

“FLAG_INSISTENT”标志

flags属性中追加此标识,则在客户响应前直接循环播放音响。

“FLAG_ONGOING_EVENT”标志

flags属性中追加此标识,则将通报归入文告窗口的“正在运营”(Ongoing)组中。表示应用程序正在运维——进程仍在后台运营,纵然应用程序不可以知道(譬如播放音乐或接听电话)。

“FLAG_NO_CLEAR”标志

flags天性中增添此标记,表示公告不容许被“扫除文告”按键肃清。那在期望通告保持运营时特意有用。

number属性

代表通告所表示的平地风波数量。此数显在情景栏Logo上。要使用此属性,必得在首先次创建布告时设为1。(假设只是在更新通告时才把此值从0改成自由大于0的数,则数字不交易会示出来。)

iconLevel属性

代表通告Logo当前的LevelListDrawable等第。通过更换那么些值,能够在气象栏中彰显Logo的卡通片,那么些值与LevelListDrawable中drawable的定义相关。实际情况请参阅LevelListDrawable。

次第能自定义更加多特点,实际情况请参阅Notification。

 

 

创立自定义的进展**View**图片 5

暗许意况下,通告窗口中的张开视图(view)包含大旨的标题和文件音信。那是由setLatestEventInfo()
contentTitlecontentText参数钦定的。但是还是能够用RemoteViews出自定义二个开展视图的布局。左边的截图就呈现了二个自定义张开视图的例子,在那之中使用了LinearLayout
构造中的ImageView和TextView。

 

要自定义展开音信的构造,必要实例化二个RemoteViews对象,并将它传递给Notification的contentView属性,同时把PendingIntent传给contentIntent属性。

 

经过例子是对创立自定义展开视图最棒的明亮情势:

1.        
为实行视图新建XML布局,建设构造多个名叫custom_notification_layout.xml的构造文件,内容如下:

<LinearLayout
xmlns:android=”” 

 
            android:orientation=”horizontal” 

 
            android:layout_width=”fill_parent” 

 
            android:layout_height=”fill_parent” 

 
            android:padding=”3dp” 

 
            > 

 
  <ImageView
android:id=”@+id/image” 

 
            android:layout_width=”wrap_content” 

 
            android:layout_height=”fill_parent” 

 
            android:layout_marginRight=”10dp” 

 
            /> 

 
  <TextView
android:id=”@+id/text” 

 
            android:layout_width=”wrap_content” 

 
            android:layout_height=”fill_parent” 

 
            android:textColor=”#000″ 

 
            /> 

</LinearLayout>

此布局用于进行视图,但ImageView和TextView的源委还亟需由应用程序来定义。RemoteViews提供了有的便于的主意来定义那一个剧情。

 

2.        
在应用程序代码里,用RemoveViews的不二等秘书籍来定义图片和文字。然后把RemoteViews对象传给Notification的contentView品质,如下所示:

RemoteViews
contentView =
new
RemoteViews(getPackageName(),
R.layout.custom_notification_layout); 

contentView.setImageViewResource(R.id.image,
R.drawable.notification_image); 

contentView.setTextViewText(R.id.text,
“Hello,
this message is in a custom expanded view”); 

notification.contentView

contentView;

如上:先把程序package名和布局能源ID传给RemoteViews的布局方法。然后用setImageViewResource()和setTextViewText()定义ImageView和TextView的内容,分别把View对象的财富ID、所赋的开始和结果作为参数字传送入。最后,把RemoteViews对象传给Notification的contentView属性。

 

3.        
由于自定义视图无需实行setLatestEventInfo()方法,因而必需用contentIntent属性来定义多少个文告所要施行的意图Intent
,如下:

Intent
notificationIntent =
new
Intent(this,
MyClass.class); 

PendingIntent
contentIntent =
PendingIntent.getActivity(this,
0,
notificationIntent,
0); 

notification.contentIntent

contentIntent;

 

4.        
以后通知能够健康发送了:

mNotificationManager.notify(CUSTOM_VIEW_ID,
notification);

 

RemoteViews类还满含了生龙活虎部分主意,便于在通报的拓宽视图里增添Chronometer或ProgressBar。关于用RemoteViews创造自定义布局的详细音讯,请参阅RemoteViews
类的参照他事他说加以考察文书档案。

注意:当建构一个自定义展开视图时,必得特别小心,保险自定义的构造能健康专业在不一致的器材方向和分辨率下。那些提出对于有着在Android上创制的View构造都以适用的,但在这里种气象下越发重大,因为构造实际可用的显示屏区域极其常有限。不要把自定义构造划杜撰计得过分复杂,何况应当要在各样境遇安插下开展测量试验。

 

Post Author: admin

发表评论

电子邮件地址不会被公开。 必填项已用*标注