Android:SystemUi有关notification
16lz
2021-01-25
Android 源码Music模块中当正在播放的音乐在下拉菜单中是有显示的。通过什么显示的--notification
关于音乐的显示过程:
1、在notification显示音乐图标
代码如下:
1)如果让notification显示自定义的view,则应该使用RemoteView,然后将remoteview赋值给notification的contentView
2)状态栏的图标(最顶层)可以通过设置icon来实现,如果没有设置contentView,则状态栏和通知栏的图标是一样的,由系统来设置背景色。如果设置了contentView,则通知栏会显示自定义的view。
3)
n.flags = Notification.FLAG_AUTO_CANCEL;
设置 n.flags 为 Notification.FLAG_AUTO_CANCEL ,该标志表示当用户点击 Clear之后,能够清除该通知。
4)addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
请注意,如果要以该Intent启动一个Activity,一定要设置 Intent.FLAG_ACTIVITY_NEW_TASK标记。
Intent.FLAG_ACTIVITY_CLEAR_TOP:如果在当前Task中,有要启动的Activity,那么把该Acitivity之前的所有Activity都关掉,并把此Activity置前以避免创建Activity的实例
Intent.FLAG_ACTIVITY_NEW_TASK:系统会检查当前所有已创建的Task中是否有该要启动的Activity的Task,若有,则在该Task上创建Activity,若没有则新建具有该Activity属性的Task,并在该新建的Task上创建Activity。
5)
//PendingIntent
PendingIntent contentIntent = PendingIntent.getActivity(
arg0.getContext(),
R.string.app_name,
i,
PendingIntent.FLAG_UPDATE_CURRENT);
PendingIntent 为Intent的包装,这里是启动Intent的描述,PendingIntent.getActivity返回的PendingIntent表示,此PendingIntent实例中的Intent是用于启动 Activity的Intent。PendingIntent.getActivity的参数依次为:Context,发送者的请求码(可以填0),用于系统发送的Intent,标志位。
其中 PendingIntent.FLAG_UPDATE_CURRENT 表示如果该描述的PendingIntent已存在,则改变已存在的PendingIntent的Extra数据为新的PendingIntent的Extra数据。
这里再简要说一下 Intent 与 PendingIntent 的区别:
Intent:意图,即告诉系统我要干什么,然后系统根据这个Intent做对应的事。如startActivity相当于发送消息,而Intent是消息的内容。
PendingIntent :包装Intent,Intent 是我们直接使用 startActivity , startService或 sendBroadcast 启动某项工作的意图。而某些时候,我们并不能直接调用startActivity ,startServide 或 sendBroadcast,而是当程序或系统达到某一条件才发送Intent。如这里的Notification,当用户点击Notification之后,由系统发出一条Activity 的 Intent 。因此如果我们不用某种方法来告诉系统的话,系统是不知道是使用 startActivity,startService 还是 sendBroadcast 来启动Intent的(当然还有其他的“描述”),因此这里便需要PendingIntent。
下面举一个简单的例子:
看完代码一切都明白了..... :SystemUi有关的Notification" title="Android:SystemUi有关的Notification" width="1" height="1">
6)
如何使自己的Notification像Android QQ一样能出现在 “正在运行的”栏目下面
其实很简单,只需设置Notification.flags =Notification.FLAG_ONGOING_EVENT;便可以了。
关于音乐的显示过程:
1、在notification显示音乐图标
代码如下:
RemoteViews views = new RemoteViews(getPackageName(),R.layout.statusbar); views.setImageViewResource(R.id.icon,R.drawable.stat_notify_musicplayerdown); if (getAudioId() < 0) { // streaming views.setTextViewText(R.id.trackname, getPath()); views.setTextViewText(R.id.artistalbum, null); } else { String artist = getArtistName(); views.setTextViewText(R.id.trackname, getTrackName()); if (artist == null || artist.equals(MediaStore.UNKNOWN_STRING)){ artist = getString(R.string.unknown_artist_name); } String album = getAlbumName(); if (album == null || album.equals(MediaStore.UNKNOWN_STRING)){ album = getString(R.string.unknown_album_name); } views.setTextViewText(R.id.artistalbum, getString(R.string.notification_artist_album, artist, album) ); } Notification status = new Notification(); status.contentView = views; status.flags |= Notification.FLAG_ONGOING_EVENT; status.icon = R.drawable.stat_notify_musicplayerup; status.contentIntent = PendingIntent.getActivity(this, 0, new Intent("com.android.music.PLAYBACK_VIEWER") .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK), 0); startForeground(PLAYBACKSERVICE_STATUS, status);
1)如果让notification显示自定义的view,则应该使用RemoteView,然后将remoteview赋值给notification的contentView
2)状态栏的图标(最顶层)可以通过设置icon来实现,如果没有设置contentView,则状态栏和通知栏的图标是一样的,由系统来设置背景色。如果设置了contentView,则通知栏会显示自定义的view。
3)
n.flags = Notification.FLAG_AUTO_CANCEL;
设置 n.flags 为 Notification.FLAG_AUTO_CANCEL ,该标志表示当用户点击 Clear之后,能够清除该通知。
4)addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
请注意,如果要以该Intent启动一个Activity,一定要设置 Intent.FLAG_ACTIVITY_NEW_TASK标记。
Intent.FLAG_ACTIVITY_CLEAR_TOP:如果在当前Task中,有要启动的Activity,那么把该Acitivity之前的所有Activity都关掉,并把此Activity置前以避免创建Activity的实例
Intent.FLAG_ACTIVITY_NEW_TASK:系统会检查当前所有已创建的Task中是否有该要启动的Activity的Task,若有,则在该Task上创建Activity,若没有则新建具有该Activity属性的Task,并在该新建的Task上创建Activity。
5)
//PendingIntent
PendingIntent contentIntent = PendingIntent.getActivity(
arg0.getContext(),
R.string.app_name,
i,
PendingIntent.FLAG_UPDATE_CURRENT);
PendingIntent 为Intent的包装,这里是启动Intent的描述,PendingIntent.getActivity返回的PendingIntent表示,此PendingIntent实例中的Intent是用于启动 Activity的Intent。PendingIntent.getActivity的参数依次为:Context,发送者的请求码(可以填0),用于系统发送的Intent,标志位。
其中 PendingIntent.FLAG_UPDATE_CURRENT 表示如果该描述的PendingIntent已存在,则改变已存在的PendingIntent的Extra数据为新的PendingIntent的Extra数据。
这里再简要说一下 Intent 与 PendingIntent 的区别:
Intent:意图,即告诉系统我要干什么,然后系统根据这个Intent做对应的事。如startActivity相当于发送消息,而Intent是消息的内容。
PendingIntent :包装Intent,Intent 是我们直接使用 startActivity , startService或 sendBroadcast 启动某项工作的意图。而某些时候,我们并不能直接调用startActivity ,startServide 或 sendBroadcast,而是当程序或系统达到某一条件才发送Intent。如这里的Notification,当用户点击Notification之后,由系统发出一条Activity 的 Intent 。因此如果我们不用某种方法来告诉系统的话,系统是不知道是使用 startActivity,startService 还是 sendBroadcast 来启动Intent的(当然还有其他的“描述”),因此这里便需要PendingIntent。
下面举一个简单的例子:
@Override public void onCreate() { super.onCreate(); Notification notification = new Notification(R.drawable.ic_launcher, "有通知到来", System.currentTimeMillis()); Intent notificationIntent = new Intent(this, MainActivity.class); //要启动的Activity PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0); notification.setLatestEventInfo(this, "这是通知的标题", "这是通知的内容", pendingIntent); startForeground(1, notification); Log.d(TAG, "onCreate() executed"); }
看完代码一切都明白了..... :SystemUi
6)
如何使自己的Notification像Android QQ一样能出现在 “正在运行的”栏目下面
其实很简单,只需设置Notification.flags =Notification.FLAG_ONGOING_EVENT;便可以了。
更多相关文章
- Nginx系列教程(六)| 手把手教你搭建 LNMP 架构并部署天空网络电影
- Android(安卓)Notification.Builder通知案例分享
- Android(安卓)内存相关 onTrimMemory,onLowMemory
- WebView设置之WebViewClient
- 【转】Android(安卓)解析如何获取SDCard 内存
- MTK 6573平台 android 2.3系统上添加维文的详细步骤
- Android改变状态栏颜色真麻烦
- android savedInstanceState相关知识点
- Android(安卓)调用相册 拍照 实现系统控件缩放 切割图片