Notification和Activity互動,notification
概述
通知(Notification)就是程式在不影響使用者操作的情況下,通過手機頂部彈出訊息告訴使用者的一種語音總機方式,並且可以通過下拉通知操作抽屜通知,實現Notification與活動、通知和服務通訊。例如:通知與活動相互連信,活動通過NotificationManager發送通知(建立通知),而抽屜通知裡面的操作則通過發送廣播事件傳遞資訊,此時活動只要已經註冊過該廣播事件的接收器,那麼就能接收到通知的資訊,從而實現通知和活動互動。
例子(通知和活動同步音樂播放和暫停)
<?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" > <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:layout_width="match_parent" android:layout_height="match_parent" android:src="@drawable/bg" android:scaleType="fitXY"/> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/play_over" android:layout_gravity="center" android:clickable="true" android:id="@+id/imageView" android:background="@drawable/img_bg"/> </FrameLayout> </LinearLayout>
<?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="64dp" android:background="#e0e0e0" android:orientation="horizontal"> <ImageView android:id="@+id/imageView1" android:layout_width="64dp" android:layout_height="64dp" android:src="@drawable/sc"/> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:id="@+id/image_control" android:clickable="true" android:padding="4dp" android:layout_alignParentLeft="true" android:layout_centerVertical="true" android:layout_width="48dp" android:layout_height="48dp" android:src="@drawable/play_over"/> <TextView android:id="@+id/tv_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@id/image_control" android:padding="4dp" android:text="Sweet Child O' Mine" android:singleLine="true" android:textAppearance="?android:attr/textAppearanceMedium"/> <TextView android:id="@+id/tv_nowTime" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_toRightOf="@id/image_control" android:text="00:00" android:layout_alignParentBottom="true"/> <TextView android:id="@+id/tv_totallTime" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_alignParentBottom="true" android:text="00:00"/> </RelativeLayout> </LinearLayout>
package com.liujun.activity;import java.text.SimpleDateFormat;import java.util.Date;import java.util.Timer;import java.util.TimerTask;import com.liujun.liujunmusicnotification.R;import android.app.Activity;import android.app.Notification;import android.app.NotificationManager;import android.app.PendingIntent;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.media.MediaPlayer;import android.os.Bundle;import android.support.v4.app.NotificationCompat;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.ImageView;import android.widget.RemoteViews;public class MainActivity extends Activity {private MediaPlayer mediaPlayer;//媒體播放器private NotificationManager notificationManager;//通知管理器private ImageView imageView;//播放音樂圖片按鈕private boolean isPlaying=false;//是否現正播放音樂//意圖public static final String PLAYMUSIC_INTENT="PLAYMUSIC_INTENT";public static final String PAUSEMUSIC_INTENT="PAUSEMUSIC_INTENT";//通知標識IDpublic static final int NOTIFICATION_ID=1;//時間計時器private Timer timer;private MyBroadCastRecever recever;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.mian_activity);//執行個體化媒體播放器mediaPlayer=MediaPlayer.create(this, R.raw.sc);//執行個體化通知管理器notificationManager=(NotificationManager) this.getSystemService(NOTIFICATION_SERVICE);timer=new Timer();imageView=(ImageView) this.findViewById(R.id.imageView);imageView.setOnClickListener(onClickListener);//註冊接收通知欄發送的廣播事件IntentFilter intentFilter=new IntentFilter();intentFilter.addAction(PAUSEMUSIC_INTENT);intentFilter.addAction(PLAYMUSIC_INTENT);recever=new MyBroadCastRecever();this.registerReceiver(recever, intentFilter);}OnClickListener onClickListener=new OnClickListener() {@Overridepublic void onClick(View v) {if (!isPlaying) {//沒有播放音樂//開始播放音樂playMusic();//更改圖片背景imageView.setImageResource(R.drawable.pause_over);//更改標誌isPlaying=true;}else {//現正播放音樂//暫停播放音樂pauseMusic();//更改圖片背景imageView.setImageResource(R.drawable.play_over);//更改標誌isPlaying=false;}//發送通知欄activitySendNotification();}};/** * 播放音樂 */protected void playMusic() {if (mediaPlayer==null) {mediaPlayer=MediaPlayer.create(MainActivity.this, R.raw.sc);}if (timer==null) {timer=new Timer();}//開啟計時器任務,每個一秒 更新抽屜通知音樂播放進度timer.schedule(new MyTimerTask(), 0, 1000);//播放音樂mediaPlayer.start();}//時間任務,更新抽屜通知,播放進度(注意:每次調用必須重新new)private class MyTimerTask extends TimerTask{@Overridepublic void run() {//工作端發送通知activitySendNotification();}}/** * 發送通知 */protected void activitySendNotification() {//通知構建器NotificationCompat.Builder builder=new NotificationCompat.Builder(this); //設定小表徵圖builder.setSmallIcon(R.drawable.favorite);//載入自訂遠程布局RemoteViews remoteView=(RemoteViews) new RemoteViews(this.getPackageName(), R.layout.my_notification);//設定不可以拉動取消抽屜通知builder.setOngoing(true);//設定標題remoteView.setTextViewText(R.id.tv_title, "Sweet Child O' Mine");//當前播放時間(注意:當進入介面播放音樂時退出介面,不是暫停時退出介面,那麼就有可能在程式執行//onDestroy()方法時將mediaPlayer釋放共置空了,而此段代碼是在子線程中的,與主線程不同步退出,//那麼就導致mediaPlayer為空白,從而報錯)if (mediaPlayer==null) {return;}Date currentDate=new Date(mediaPlayer.getCurrentPosition());//總時間長度Date totalDate=new Date(mediaPlayer.getDuration());SimpleDateFormat simpleDateFormat=new SimpleDateFormat("mm:ss");//設定當前播放時間進度remoteView.setTextViewText(R.id.tv_nowTime, simpleDateFormat.format(currentDate));//設定歌曲總時間長度remoteView.setTextViewText(R.id.tv_totallTime, simpleDateFormat.format(totalDate));Log.i("liujun", "是否現正播放音樂:--"+isPlaying);if (isPlaying) {//現正播放音樂//顯示可以暫停圖片remoteView.setImageViewResource(R.id.image_control, R.drawable.pause_over);}else {//顯示可以播放圖片remoteView.setImageViewResource(R.id.image_control, R.drawable.play_over);}//通知欄,互動互動notificationToActivity(remoteView,isPlaying);//載入視圖布局builder.setContent(remoteView);//建立通知Notification notification=builder.build();//發送通知notificationManager.notify(NOTIFICATION_ID, notification);}/** * 通知欄互動活動 * @param isPlaying */private void notificationToActivity(RemoteViews remoteView,boolean isPlaying) {Intent intent=new Intent();if (isPlaying) {//現正播放音樂//試圖暫停播放音樂intent.setAction(PAUSEMUSIC_INTENT);//更改圖片remoteView.setImageViewResource(R.id.image_control, R.drawable.pause_over);/*//更新標誌isPlaying=false;*/}else {//沒有播放音樂//試圖播放音樂intent.setAction(PLAYMUSIC_INTENT);//更改圖片remoteView.setImageViewResource(R.id.image_control, R.drawable.play_over);/*//更新標誌isPlaying=true;*/}//發送廣播,更新ActivityPendingIntent pendingIntent=PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);remoteView.setOnClickPendingIntent(R.id.image_control, pendingIntent);}//廣播接收器(接收通知發送的廣播事件)private class MyBroadCastRecever extends BroadcastReceiver{@Overridepublic void onReceive(Context context, Intent intent) {if (intent.getAction()==PLAYMUSIC_INTENT) {//通知端播放音樂//播放音樂playMusic();//是否播放現正播放音樂標誌isPlaying=true;//更改圖片標誌imageView.setImageResource(R.drawable.pause_over);}else if(intent.getAction()==PAUSEMUSIC_INTENT){//通知端暫停音樂//暫停音樂pauseMusic();//是否播放現正播放音樂標誌isPlaying=false;//更改圖片標誌imageView.setImageResource(R.drawable.play_over);}//上面更新活動的資訊,這時又要發送通知activitySendNotification();}}/** * 暫停播放音樂 */protected void pauseMusic() {if (mediaPlayer!=null&&mediaPlayer.isPlaying()) {mediaPlayer.pause();}//暫停發送通知if (timer!=null) {timer.cancel();timer=null;}}@Overrideprotected void onDestroy() {super.onDestroy();this.unregisterReceiver(recever);//釋放資源if (mediaPlayer!=null) {mediaPlayer.release();mediaPlayer=null;}//是否通知欄notificationManager.cancel(NOTIFICATION_ID);}}
notification中使用pendingintent回到activity,為何是的新建立的ac
你可以在manifest中的設定singleTop或者singleTask,可以避免建立新的activity
android開發 通過點擊Notification開啟一個activity, 該activity繼承自TabActivity
在PendingIntent設定intent的時候,可以在intent中添加bundle資料進去的,然後你要啟動的TabActivity中的onstart方法中讀取該資料,然後設定當前tab