Notification是Android系统为通知用户某些进程发生改变时用到的工具类。Android手机在收到短信是都会在屏幕上方出现短信息的缩略内容,以及其他的消息通知或者是推送信息都将首先以通知的形式告诉用户。这是怎么实现的呢?接下来就来看看Notification是怎么实现的。
一个简单的通知可分为三步来定义:
1、创建Notification Buider:
创建Notifiction时,可以用NotificationCompat.Builder对象来指定Notification的UI内容,一个NotificationCompat.Builder对象至少包含以下内容,
一个小的ICON 用setSmallIcon()方法设置:
一个标题 setContetnTitle();
setAutoCancel()为true是点击通知后该通知会自动消失
setTicker("")是接收到通知时手机屏幕上方弹幕提示的内容
<span style="white-space:pre"> </span>NotificationCompat.Builder builder = new NotificationCompat.Builder( this); builder.setSmallIcon(R.drawable.img_smile); // 设置通知显示图标 builder.setContentTitle("饿了么"); builder.setContentText("你有新的饿了么订单,请及时处理"); builder.setAutoCancel(true); //点击通知后消失 builder.setTicker("你有新的饿了么订单,请及时处理"); //通知出现时让其滚动显示这段内容2、设置Notification的action(行为),也就是当点击通知是需要跳转的什么地方或是做什么。比如说当收到短信时点击通知栏里的该短信就会打开短信,查看短信的详细内容。这里实现的是启动一个activity,需要定义一个PendingIntent,它包含了一个启动activity的Intent对象。
/* 通知行为,点击通知时启动actvity 行为必须放在发送通知之前*/ Intent intent = new Intent(this, MusicActivity.class); int requestCode = 1; // 请求码,跟activity有回传值启动请求码一致 PendingIntent pendingIntent = PendingIntent.getActivity(this, requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT); builder.setContentIntent(pendingIntent); //点击时启动activity
/* 发送通知 */ NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); int notificationId = 1; // 作为通知的唯一标识id,当多次发送时会去比照这个id若有这个id并且通知还没取消,则不会再次发送。 // Notification notification = builder.getNotification(); // 这个方法过时了 Notification notification = builder.build(); manager.notify(notificationId, notification);发送通知用到一个NotificationManager对象调用notify()方法发送通知。只有发送通知才用到了Notification对象。是通过前面的NotificationCompat.Builder对象的build()方法的到notification对象。
这样一个简单的通知就完成了。效果图是点击按钮就发送通知。
二、更新通知。
在发送通知时定义了一个int型的notificationId。这个是该通知的唯一标识,不改变该Id,改变NotificationCompat.Builder对象的icon,contentTitle以及contentText等,再次调用notify方法就可以刷新通知了。
<span style="white-space:pre"> </span>NotificationCompat.Builder builder = new NotificationCompat.Builder( this); builder.setSmallIcon(R.drawable.img_person); // 设置通知显示图标 builder.setContentTitle("刷新饿了么"); builder.setContentText("刷新饿了么++你有新的饿了么订单,请及时处理"); builder.setAutoCancel(true); //点击通知后消失 builder.setTicker("刷新饿了么——————你有新的饿了么订单,请及时处理"); //通知出现时让其滚动显示这段内容 int notificationId = 1; // 统一唯一标识id就可以刷新通知 // Notification notification = builder.getNotification(); // 这个方法过时了 Notification notification = builder.build(); manager.notify(notificationId, notification);
三、清空通知:
NotificationManager类里定义了清空通知的方法。
cancel(int id);清除对应id通知 cancel(String tag, int id); cancelAll();清除所有通知。很简单,看名字就知道是什么意思。
四、导航通知。
1、常规activity:点击通知,启动的是该应用工作流中的某一个activity.
点击通知,查看了通知内容后,在点击返回键时是直接退出到主界面。但是很多时候我们需要指定点按退出键之后的界面。比如当接收到短信通知时,点击短信通知,浏览完短信后点击back按钮退回到的是消息列表界面。实现这个需求只需在通知行为上做改变。用到一个TaskStackBuilder 类来指定跳转的activity,并在mainfest文件中设置该activity的父activity.。
Intent intent = new Intent(this, MusicActivity.class);
stackBuilder.addParentStack(MusicActivity.class);
这两个方法中的参数是同一个activity
<span style="white-space:pre"> </span>Intent intent = new Intent(this, MusicActivity.class); TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); //得到返回栈 stackBuilder.addParentStack(MusicActivity.class); //向返回栈中压入activity,这里注意不是压入的父activity,而是点击通知启动的activity stackBuilder.addNextIntent(intent); int requestCode = 1; // pendingIntent 是由stackBuilder工厂得到 PendingIntent pendingIntent = stackBuilder.getPendingIntent(requestCode, PendingIntent.FLAG_CANCEL_CURRENT); builder.setContentIntent(pendingIntent); //点击时启动activity
<activity android:name="music.mediaplayer.MusicActivity" android:label="播放音乐"> <meta-data android:name="android.support.PARENT_ACTIVITY" android:value="com.example.call.MainActivity"/> </activity>API14之间可以用
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.example.call.MainActivity"/>指定父activity
API14之后 Android:parentActivityName=" 指定的父activity " 来指定父activity
整个按钮监听代码:
<span style="white-space:pre"> </span>NotificationCompat.Builder builder = new NotificationCompat.Builder( this); builder.setSmallIcon(R.drawable.meituan_image8); // 设置通知显示图标 builder.setContentTitle("导航通知"); builder.setContentText("导航通知,点击通知启动activity返回时不返回到主界面,返回到指定的parentactivity界面"); builder.setAutoCancel(true); //点击通知后消失 builder.setTicker("导航通知,点击通知启动activity返回时不返回到主界面,返回到指定的parentactivity界面"); //通知出现时让其滚动显示这段内容 /* 通知行为,点击通知时启动actvity 行为必须放在发送通知之前*导航通知就需要建立返回栈并在xml文件中指定父activity*/ Intent intent = new Intent(this, MusicActivity.class); TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); //得到返回栈 stackBuilder.addParentStack(MusicActivity.class); //向返回栈中压入activity,这里注意不是压入的父activity,而是点击通知启动的activity stackBuilder.addNextIntent(intent); int requestCode = 1; // pendingIntent 是由stackBuilder工厂得到 PendingIntent pendingIntent = stackBuilder.getPendingIntent(requestCode, PendingIntent.FLAG_CANCEL_CURRENT); builder.setContentIntent(pendingIntent); //点击时启动activity /* 发送通知 */ // NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);// 启动这个服务可以定义为全局 int notificationId = 11; // 作为通知的唯一标识id,当多次发送时会去比照这个id若有这个id并且通知还没取消,则不会再次发送。 // Notification notification = builder.getNotification(); // 这个方法过时了 Notification notification = builder.build(); manager.notify(notificationId, notification);
2、特殊activity。启动的是通知特有的activity。完全跟应用工作流无关的activity。
当正在打游戏操作时,接受到某些通知,点击通知跳转activity后点按返回键,我们希望的是退回游戏界面。而不是主界面或是其他界面。那么只需注册该activity不需要指定返回父类就可以实现。
五、下载通知。
每当下载应用和其他东东时,通知栏都有一个下载进度条。NotificationCompat.Builder类也提供了setProgress(max, progress, false)方法将进度条加载到通知中。第一个参数是进度条的最大值。第二个是参数是当前进度。第三个参数是设置进度条是否为确定型进度条或者不确定型进度条。
<span style="white-space:pre"> </span>new Thread(new Runnable() { @Override public void run() { for(int i = 1;i <= 100;i++){ builder.setProgress(100, i, false); manager.notify(notificationId, builder.build()); //builder.build()这个参数必须在这里定义 try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } } builder.setContentText("下载完成"); builder.setProgress(0, 0, false); // 下载完成让进度条消失 manager.notify(notificationId, builder.build()); } }).start();测试时模拟了一个线程来加载进度。方法全部代码如下:
public void dowlendNotification(){ final NotificationCompat.Builder builder = new NotificationCompat.Builder(this); builder.setSmallIcon(R.drawable.img_buetyful); builder.setContentTitle("下载通知"); builder.setContentText("正在下载xxxx"); builder.setTicker("开始下载xxxxxxx"); builder.setAutoCancel(true); final int notificationId = 100; new Thread(new Runnable() { @Override public void run() { for(int i = 1;i <= 100;i++){ builder.setProgress(100, i, false); manager.notify(notificationId, builder.build()); //builder.build()这个参数必须在这里定义 try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } } builder.setContentText("下载完成"); builder.setProgress(0, 0, false); // 下载完成让进度条消失 manager.notify(notificationId, builder.build()); } }).start(); }
六、bigView型
都见过闹钟通知吧,闹钟通知下面还有两个按钮,确定和取消按钮以及各个按钮所携带的图标。这是通过builder.setStyle(new NotificationCompat.BigTextStyle().bigText("睡你麻痹起来嗨"));setStyle来设置的。当然点击按钮事件也是可以关联到服务或是其他activity的。这些都是通过Intent意图来关联的。这里是实现的是通过Intent关联服务、传递一个mp3的路径并启动服务让其播放音乐
。通过pendingIntent来实现action。
<span style="white-space:pre"> </span>NotificationCompat.Builder builder = new NotificationCompat.Builder(this); builder.setSmallIcon(R.drawable.meituan_image8); builder.setContentTitle("闹钟"); //builder.setContentText("睡你麻痹起来嗨"); builder.setTicker("睡你麻痹起来嗨"); builder.setAutoCancel(true); builder.setStyle(new NotificationCompat.BigTextStyle().bigText("睡你麻痹起来嗨")); Intent playIntent = new Intent(this,PlayerService.class); playIntent.setAction("aaaa"); //必须设置action才能传不同的参数 playIntent.putExtra("MUSIC_STATE", 11); playIntent.putExtra("MUSIC_PATH", "file://" + Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC) + "/a.mp3"); PendingIntent playPendingIntent = PendingIntent.getService(this, 10, playIntent, PendingIntent.FLAG_CANCEL_CURRENT); builder.addAction(R.drawable.img_person, "播放", playPendingIntent); //设置下面两个按钮显示的图标以及内容 Intent pauseIntent = new Intent(this,PlayerService.class); pauseIntent.putExtra("MUSIC_STATE", 1); pauseIntent.setAction("bbbb");//这里也要设置action而且不能刚上面的一样 PendingIntent pausePendingIntent = PendingIntent.getService(this, 10, pauseIntent, PendingIntent.FLAG_CANCEL_CURRENT); builder.addAction(R.drawable.img_smile, "暂停", pausePendingIntent); int id = 1002; manager.notify(id, builder.build());这里需要注意的是每一个按钮对应的Intent都需要设置一个action,就是这里的playIntent.setAction("aaaa");和pauseIntent.setAction("bbbb")。若不设置就传不了参数到服务。PendingIntent 类中的PendingIntent.getService(this, 10, pauseIntent, PendingIntent.FLAG_CANCEL_CURRENT);就可以启动服务。这是startservice方式启动的。
七、自定义Notification
自定义Notification在开发中应用非常广泛。最常见的就是后台播放音乐时的通知。Android采用了RemoteViews来解析布局文件并加载到通知上。具体如下:
<span style="white-space:pre"> </span>NotificationCompat.Builder builder = new NotificationCompat.Builder(this); builder.setSmallIcon(R.drawable.adapter_homework_icon); //自定义Notification必须至少设置这项才会发送成功 RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.my_notification_layout); //xml资源布局文件 builder.setContent(remoteViews); int id = 111; manager.notify(id, builder.build());xml布局上按钮的监听事件是通过remoteViews.setOnClickPendingIntent(viewId, pendingIntent)方法来实现的。viewId是xml布局中对应控件的id. pendingIntent是Intent意图对象构造而来的pendingIntent上面已有提到。
这里注意自定义Notification里必须设置setSmallIcon();属性。不然就通知就不能发送。
最后贴上所有测试代码:
主activity:
package notification; import music.mediaplayer.MusicActivity; import android.app.Activity; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Intent; import android.os.Bundle; import android.os.Environment; import android.support.v4.app.NotificationCompat; import android.support.v4.app.TaskStackBuilder; import android.view.View; import android.view.View.OnClickListener; import android.view.Window; import android.widget.Button; import android.widget.RemoteViews; import com.example.call.R; public class NotificationActivity extends Activity implements OnClickListener{ private Button mSendBtn,mUpdateBut,mCleanBtn,mNavigationBtn; NotificationManager manager; private Button mDowlendBtn ,mUnDowlendBtn,mBigViewBtn,mMyNotificationBtn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.notification_main_layout); mSendBtn = (Button) findViewById(R.id.notification_btn); mUpdateBut = (Button) findViewById(R.id.notification_update_btn); mCleanBtn = (Button) findViewById(R.id.notification_clean_btn); mNavigationBtn = (Button) findViewById(R.id.notification_navigation_btn); mDowlendBtn = (Button) findViewById(R.id.notification_dowlend_btn); mUnDowlendBtn = (Button) findViewById(R.id.notification_unknowdowlend_btn); mBigViewBtn = (Button) findViewById(R.id.notification_bigView_btn); mMyNotificationBtn = (Button) findViewById(R.id.notification_myself_btn); mSendBtn.setOnClickListener(this); mMyNotificationBtn.setOnClickListener(this); mBigViewBtn.setOnClickListener(this); mUnDowlendBtn.setOnClickListener(this); mNavigationBtn.setOnClickListener(this); mCleanBtn.setOnClickListener(this); mUpdateBut.setOnClickListener(this); mDowlendBtn.setOnClickListener(this); manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); //这个可以共用 } @Override public void onClick(View v) { switch(v.getId()){ case R.id.notification_btn: sendNotification(); break; case R.id.notification_update_btn: updateNotification(); break; case R.id.notification_clean_btn: cleanNotification(); break; case R.id.notification_navigation_btn: navigationNotification(); break; case R.id.notification_dowlend_btn: dowlendNotification(); break; case R.id.notification_unknowdowlend_btn: unknowDowlendNotification(); break; case R.id.notification_bigView_btn: bigViewNotification(); break; case R.id.notification_myself_btn: myNotification(); break; } } /*发送通知*/ public void sendNotification() { /* 构造通知显示界面 */ NotificationCompat.Builder builder = new NotificationCompat.Builder( this); builder.setSmallIcon(R.drawable.img_smile); // 设置通知显示图标 builder.setContentTitle("饿了么"); builder.setContentText("你有新的饿了么订单,请及时处理"); builder.setAutoCancel(true); //点击通知后消失 builder.setTicker("你有新的饿了么订单,请及时处理"); //通知出现时让其滚动显示这段内容 /* 通知行为,点击通知时启动actvity 行为必须放在发送通知之前*/ Intent intent = new Intent(this, MusicActivity.class); int requestCode = 1; // 请求码,跟activity有回传值启动请求码一致 PendingIntent pendingIntent = PendingIntent.getActivity(this, requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT); builder.setContentIntent(pendingIntent); //点击时启动activity /* 发送通知 */ // NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); int notificationId = 1; // 作为通知的唯一标识id,当多次发送时会去比照这个id若有这个id并且通知还没取消,则不会再次发送。 // Notification notification = builder.getNotification(); // 这个方法过时了 Notification notification = builder.build(); manager.notify(notificationId, notification); } /*刷新通知*/ public void updateNotification(){ /*设置通知界面*/ NotificationCompat.Builder builder = new NotificationCompat.Builder( this); builder.setSmallIcon(R.drawable.img_person); // 设置通知显示图标 builder.setContentTitle("刷新饿了么"); builder.setContentText("刷新饿了么++你有新的饿了么订单,请及时处理"); builder.setAutoCancel(true); //点击通知后消失 builder.setTicker("刷新饿了么——————你有新的饿了么订单,请及时处理"); //通知出现时让其滚动显示这段内容 int notificationId = 1; // 统一唯一标识id就可以刷新通知 // Notification notification = builder.getNotification(); // 这个方法过时了 Notification notification = builder.build(); manager.notify(notificationId, notification); } /*清除通知*/ public void cleanNotification(){ manager.cancel(1); } /*通知导航1、常规activity(工作流中的axtivity) 2、特殊activity,工作流之外的activity*/ public void navigationNotification(){ NotificationCompat.Builder builder = new NotificationCompat.Builder( this); builder.setSmallIcon(R.drawable.meituan_image8); // 设置通知显示图标 builder.setContentTitle("导航通知"); builder.setContentText("导航通知,点击通知启动activity返回时不返回到主界面,返回到指定的parentactivity界面"); builder.setAutoCancel(true); //点击通知后消失 builder.setTicker("导航通知,点击通知启动activity返回时不返回到主界面,返回到指定的parentactivity界面"); //通知出现时让其滚动显示这段内容 /* 通知行为,点击通知时启动actvity 行为必须放在发送通知之前*导航通知就需要建立返回栈并在xml文件中指定父activity*/ Intent intent = new Intent(this, MusicActivity.class); TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); //得到返回栈 stackBuilder.addParentStack(MusicActivity.class); //向返回栈中压入activity,这里注意不是压入的父activity,而是点击通知启动的activity stackBuilder.addNextIntent(intent); int requestCode = 1; // pendingIntent 是由stackBuilder工厂得到 PendingIntent pendingIntent = stackBuilder.getPendingIntent(requestCode, PendingIntent.FLAG_CANCEL_CURRENT); builder.setContentIntent(pendingIntent); //点击时启动activity /* 发送通知 */ // NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);// 启动这个服务可以定义为全局 int notificationId = 11; // 作为通知的唯一标识id,当多次发送时会去比照这个id若有这个id并且通知还没取消,则不会再次发送。 // Notification notification = builder.getNotification(); // 这个方法过时了 Notification notification = builder.build(); manager.notify(notificationId, notification); } /*确定型下载通知*/ public void dowlendNotification(){ final NotificationCompat.Builder builder = new NotificationCompat.Builder(this); builder.setSmallIcon(R.drawable.img_buetyful); builder.setContentTitle("下载通知"); builder.setContentText("正在下载xxxx"); builder.setTicker("开始下载xxxxxxx"); builder.setAutoCancel(true); final int notificationId = 100; new Thread(new Runnable() { @Override public void run() { for(int i = 1;i <= 100;i++){ builder.setProgress(100, i, false); manager.notify(notificationId, builder.build()); //builder.build()这个参数必须在这里定义 try { Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } } builder.setContentText("下载完成"); builder.setProgress(0, 0, false); // 下载完成让进度条消失 manager.notify(notificationId, builder.build()); } }).start(); } /*不确定型下载通知*/ public void unknowDowlendNotification(){ NotificationCompat.Builder builder = new NotificationCompat.Builder(this); builder.setSmallIcon(R.drawable.img_buetyful); builder.setContentTitle("下载通知"); builder.setContentText("正在下载xxxx"); builder.setTicker("开始下载xxxxxxx"); builder.setAutoCancel(true); builder.setProgress(0, 0, true); // true false 决定是确定型seekbar还是不确定型seekbar int notificationId = 101; manager.notify(notificationId, builder.build()); } /*bigView通知*/ public void bigViewNotification(){ NotificationCompat.Builder builder = new NotificationCompat.Builder(this); builder.setSmallIcon(R.drawable.meituan_image8); builder.setContentTitle("闹钟"); //builder.setContentText("睡你麻痹起来嗨"); builder.setTicker("睡你麻痹起来嗨"); builder.setAutoCancel(true); builder.setStyle(new NotificationCompat.BigTextStyle().bigText("睡你麻痹起来嗨")); Intent playIntent = new Intent(this,PlayerService.class); playIntent.setAction("aaaa"); //必须设置action才能传不同的参数 playIntent.putExtra("MUSIC_STATE", 11); playIntent.putExtra("MUSIC_PATH", "file://" + Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC) + "/a.mp3"); PendingIntent playPendingIntent = PendingIntent.getService(this, 10, playIntent, PendingIntent.FLAG_CANCEL_CURRENT); builder.addAction(R.drawable.img_person, "播放", playPendingIntent); //设置下面两个按钮显示的图标以及内容 Intent pauseIntent = new Intent(this,PlayerService.class); pauseIntent.putExtra("MUSIC_STATE", 1); pauseIntent.setAction("bbbb");//这里也要设置action而且不能刚上面的一样 PendingIntent pausePendingIntent = PendingIntent.getService(this, 10, pauseIntent, PendingIntent.FLAG_CANCEL_CURRENT); builder.addAction(R.drawable.img_smile, "暂停", pausePendingIntent); int id = 1002; manager.notify(id, builder.build()); } /*自定义通知显示栏*/ public void myNotification(){ NotificationCompat.Builder builder = new NotificationCompat.Builder(this); builder.setSmallIcon(R.drawable.adapter_homework_icon); //自定义Notification必须至少设置这项才会发送成功 RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.my_notification_layout); //xml资源布局文件 builder.setContent(remoteViews); int id = 111; manager.notify(id, builder.build()); } }
package notification; import java.io.IOException; import mylog.Mylog; import android.app.Service; import android.content.Intent; import android.media.MediaPlayer; import android.os.IBinder; public class PlayerService extends Service { MediaPlayer mMediaPlayer ; @Override public void onCreate() { super.onCreate(); mMediaPlayer = new MediaPlayer(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { String path = intent.getStringExtra("MUSIC_PATH"); if(intent.getIntExtra("MUSIC_STATE", 0) == 1){ pauseMusic(); }else{ pauseMusic(); playMusic(path); } return super.onStartCommand(intent, flags, startId); } @Override public IBinder onBind(Intent intent) { return null; } public void pauseMusic(){ if(mMediaPlayer.isPlaying()){ mMediaPlayer.pause(); }else{ mMediaPlayer.start(); } } /*播放音乐*/ public void playMusic(String path){ if(mMediaPlayer != null){ try { mMediaPlayer.reset(); mMediaPlayer.setDataSource(path); mMediaPlayer.prepare(); mMediaPlayer.start(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } }
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:id="@+id/notification_btn" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="点击发送通知"/> <Button android:id="@+id/notification_update_btn" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="刷新通知"/> <Button android:id="@+id/notification_clean_btn" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="清除通知"/> <Button android:id="@+id/notification_navigation_btn" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="导航通知"/> <Button android:id="@+id/notification_dowlend_btn" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="确定型下载通知"/> <Button android:id="@+id/notification_unknowdowlend_btn" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="不确定型下载通知"/> <Button android:id="@+id/notification_bigView_btn" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="bigView通知"/> <Button android:id="@+id/notification_myself_btn" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="自定义通知显示拦"/> </LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/mp3_btn_linearLayout" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:gravity="center_vertical" android:orientation="horizontal" > <ImageView android:id="@+id/play_mode_img" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginLeft="3dp" android:layout_weight="1" android:clickable="true" android:src="@drawable/play_list_mode_sequent_normal" /> <ImageView android:id="@+id/mp3_lastMusic_btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:clickable="true" android:src="@drawable/landscape_player_btn_pre_normal" /> <ImageView android:id="@+id/mp3_puseMusic_btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:clickable="true" android:src="@drawable/landscape_player_btn_play_normal" /> <ImageView android:id="@+id/mp3_nextMusic_btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:clickable="true" android:src="@drawable/landscape_player_btn_next_normal" /> </LinearLayout>