RemoteViews 与 Activity 的区别
- RemoteViews 主要用于通知栏部件和桌面部件的布局,而 Activity 用于活动页面的布局
- RemoteViews 只支持少数几种控件,如 TextView、ImageView、Button、ImageButton、ProgressBar、Chronometer、AnalogClock
- RemoteViews 不可直接获取和设置控件信息,只能通过该对象的 set 方法来修改控件信息
常用API详解
// 构造函数,第一个是包名,第二个是布局参数
RemoteViews(String packageName, int layoutId)
// 设置指定控件是否可见
setViewVisibility(int viewId, int visibility)
// 设置指定控件的间距
setViewPadding(int viewId, int left, int top, int right, int bottom)
// 设置文本控件的文字内容
setTextViewText(int viewId, CharSequence text)
// 设置文本控件的文字大小
setTextViewTextSize(int viewId, int units, float size)
// 设置文本控件的文字颜色
setTextColor(int viewId, @ColorInt int color)
// 设置文本控件周围的图标
setTextViewCompoundDrawables(int viewId, int left, int top, int right, int bottom)
// 设置 ImageView 或 ImageButton 控件的资源编号
setImageViewResource(int viewId, int srcId)
// 设置 ImageView 或 ImageButton 控件的位图图像
setImageViewBitmap(int viewId, Bitmap bitmap)
// 设置计时器信息
setChronometer(int viewId, long base, String format, boolean started)
// 设置进度条信息
gressBar(int viewId, int max, int progress, boolean indeterminate)
// 设置指定控件的点击响应动作
setOnClickPendingIntent(int viewId, PendingIntent pendingIntent)
自定义一个播放器通知视图
布局文件
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center_vertical"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:padding="10dp">
<androidx.appcompat.widget.AppCompatImageView
android:layout_width="50dp"
android:layout_height="50dp"
android:src="@mipmap/ic_app"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@+id/pb_progress"
tools:ignore="MissingConstraints" />
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<ProgressBar
android:id="@+id/pb_progress"
style="?android:attr/progressBarStyleHorizontal"
android:layout_width="match_parent"
android:layout_height="30dp"
app:layout_constraintRight_toRightOf="parent"
tools:ignore="MissingConstraints" />
<FrameLayout
android:layout_width="match_parent"
android:layout_gravity="center_horizontal"
android:gravity="center_vertical"
android:layout_height="wrap_content">
<androidx.appcompat.widget.AppCompatTextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="海阔天空-Beyound"
/>
<androidx.appcompat.widget.AppCompatButton
android:layout_width="wrap_content"
android:text="暂停"
android:layout_gravity="right"
android:layout_height="wrap_content"/>
</FrameLayout>
</androidx.appcompat.widget.LinearLayoutCompat>
</androidx.appcompat.widget.LinearLayoutCompat>
构建远程视图
private fun buildRemoteMusic(event:String,song:String,isPlay:Boolean,progress: Int,time:Long):RemoteViews{
val notify_music = RemoteViews(packageName,R.layout.activity_progress)
if (isPlay){
notify_music.setTextViewText(R.id.btn_play,"暂停")
notify_music.setTextViewText(R.id.tv_play,song+"正在播放")
notify_music.setChronometer(R.id.pb_progress,time,"%s",true)
}else{
notify_music.setTextViewText(R.id.btn_play,"播放")
notify_music.setTextViewText(R.id.tv_play,song+"暂停播放")
notify_music.setChronometer(R.id.pb_progress,time,"%s",true)
}
notify_music.setProgressBar(R.id.pb_progress,100,progress,false)
val pIntent = Intent(event)
val piPause = PendingIntent.getBroadcast(this,R.string.app_name,pIntent,PendingIntent.FLAG_UPDATE_CURRENT)
// 设置暂停/继续按钮的点击动作对应的广播事件
notify_music.setOnClickPendingIntent(R.id.btn_play,piPause)
return notify_music
}