• Android简易实战教程--第三十八话《自定义通知NotifiCation》


    上一篇小案例,完成了一个普通的通知,点击通知启动了一个活动。但是那里的通知没有加入些“靓点”,这一篇就给它加入自定义的布局,完成自定义的通知。

    应用:比如QQ音乐为例,当点击音乐播放的时候,手机屏幕上方就会展示播放音乐的通知,这个通知不仅仅拥有布局,而且响应点击事件,能完成上一曲下一曲的切换。今天这个小案例,就以此为背景展开。

    首先,主活动布局不需要改变,还是放置两个按钮用于开启、关闭服务。

    主活动中的代码做了了较大改变,如下:

    package com.example.notification;
    
    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.support.v4.app.NotificationCompat;
    import android.support.v4.app.NotificationCompat.Builder;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.RemoteViews;
    
    public class MainActivity extends Activity {
    
    	private Button btShow;
    	private Button btCancel;
    	private NotificationManager manager;
    
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		btShow = (Button) findViewById(R.id.show);
    		btCancel = (Button) findViewById(R.id.cancel);
    		
    		btShow.setOnClickListener(new OnClickListener() {
    
    			@Override
    			public void onClick(View v) {
    				// 展示通知
    				showNotificationNewAPI();
    			}
    		});
    
    		btCancel.setOnClickListener(new OnClickListener() {
    
    			@Override
    			public void onClick(View v) {
    				// 关闭通知
    				cancelNotification();
    			}
    		});
    	}
    	
    	/**新API展示通知*/
    	public void showNotificationNewAPI(){
    		/**获取通知对象*/
    		manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    		
    		//自定义布局的通知
    		Notification notification = showCustomViewNotification();
    		
    		//开启通知,第一个参数类似代表该通知的id,标记为1
    		manager.notify(1, notification);
    	}
    
    
    	/**自定义布局的通知
    	 * @return */
    	private Notification showCustomViewNotification() {
    		NotificationCompat.Builder builder = new Builder(getApplicationContext());
    		
    		builder.setSmallIcon(R.drawable.notification_music_playing)//设置通知显示的图标
    		.setTicker("ticker")//设置通知刚刚展示时候瞬间展示的通知信息
    		.setWhen(System.currentTimeMillis())//设置通知何时出现,System.currentTimeMillis()表示当前时间显示
    		/**以上三种方式必须设置,少一项都不发展示通知*/
    		.setOngoing(true)//设置滑动通知不可删除
    		.setContent(getRemoteView());//给通知设置内容,这个内容为自定义的布局
    		
    		return builder.build();
    	}
    	
    	/**获取自定义通知使用的布局View*/
    	private RemoteViews getRemoteView(){
    		RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.notification_layout);
    		
    		//设置标题
    		remoteViews.setTextViewText(R.id.tv_title, "爱你一万年");
    		//设置歌手名
    		remoteViews.setTextViewText(R.id.tv_arties, "刘德华");
    		
    		//设置点击事件
    		remoteViews.setOnClickPendingIntent(R.id.ll_root, getPaddingIntent());
    		remoteViews.setOnClickPendingIntent(R.id.ivnext, getNextPaddingIntent());
    		remoteViews.setOnClickPendingIntent(R.id.ivpre, getPrePaddingIntent());
    		
    		return remoteViews;
    	}
    
    	/**获取PendingIntent*/
    	private PendingIntent getPaddingIntent() {
    		//真正的意图
    		Intent intent = new Intent(this, DemoActivity.class);
    		intent.putExtra("msg", "我是从通知栏启动的!");
    		// 延迟意图,用于启动活动、服务、发送广播等。携带真正的意图对象
    		PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
    				intent, PendingIntent.FLAG_UPDATE_CURRENT);
    		return pendingIntent;
    	}
    
    	/**获取下一曲的Paddingintent*/
    	private PendingIntent getNextPaddingIntent() {
    		// 真正的意图
    		Intent intent = new Intent(this, DemoActivity.class);
    		intent.putExtra("msg", "我是从通知栏启动的!点击了下一曲按钮");
    		// 延迟意图,用于启动活动、服务、发送广播等。携带真正的意图对象
    		PendingIntent pendingIntent = PendingIntent.getActivity(this, 1,
    				intent, PendingIntent.FLAG_UPDATE_CURRENT);
    		return pendingIntent;
    	}
    
    	/**获取上一曲的paddingintent*/
    	private PendingIntent getPrePaddingIntent() {
    		// 真正的意图
    		Intent intent = new Intent(this, DemoActivity.class);
    		intent.putExtra("msg", "我是从通知栏启动的!点击了上一曲按钮");
    		// 延迟意图,用于启动活动、服务、发送广播等。携带真正的意图对象
    		PendingIntent pendingIntent = PendingIntent.getActivity(this, 2,
    				intent, PendingIntent.FLAG_UPDATE_CURRENT);
    		return pendingIntent;
    	}
    
    	/**取消通知*/
    	public void cancelNotification(){
    		manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    		//1表示我要取消标记的通知
    		manager.cancel(1);
    	}
    }
    
    代码已经写得很想详细了。。。很显然主要是下面这个方法为核心:

    private RemoteViews getRemoteView(){
    		RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.notification_layout);
    		
    		//设置标题
    		remoteViews.setTextViewText(R.id.tv_title, "爱你一万年");
    		//设置歌手名
    		remoteViews.setTextViewText(R.id.tv_arties, "刘德华");
    		
    		//设置点击事件
    		remoteViews.setOnClickPendingIntent(R.id.ll_root, getPaddingIntent());
    		remoteViews.setOnClickPendingIntent(R.id.ivnext, getNextPaddingIntent());
    		remoteViews.setOnClickPendingIntent(R.id.ivpre, getPrePaddingIntent());
    		
    		return remoteViews;
    	}

    它让我们自定义布局,并且对布局中的数据做了数据展示与事件处理。相信它的意思很简单的就能体会。

    我们把自定义的布局也要整理出来:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:gravity="center_vertical"
        android:padding="8dp"
        android:id="@+id/ll_root"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >
        
        <!-- icon -->
        <ImageView 
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/notification_music_playing"/>
        
        <!-- 歌曲信息 -->
        <LinearLayout 
            android:layout_marginLeft="10dp"
            android:layout_weight="1"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:orientation="vertical">
            <!-- 歌曲名 -->
            <TextView 
                android:id="@+id/tv_title"
                android:singleLine="true"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="歌曲名"
                android:textColor="@color/white"/>
            <!-- 歌手名 -->
            <TextView 
                android:id="@+id/tv_arties"
                android:singleLine="true"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="歌手名"
                android:textColor="@color/halfwhite"/>
        </LinearLayout>
        <!-- 上一曲 -->
        <ImageView 
            android:id="@+id/ivpre"
            android:layout_marginRight="20dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/icon_notification_pre"/>
        <!-- 下一曲 -->
        <ImageView 
            android:id="@+id/ivnext"
            android:layout_marginRight="20dp"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/icon_notification_next"/>
    </LinearLayout>

    还差一点,我们给通知上边的按钮添加了点击事件,事件目的是启动另一个Activity,所以要到这个activity获取这些数据,做一个土司处理。

    另一个活动中的代码:

    package com.example.notification;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.widget.Toast;
    
    public class DemoActivity extends Activity {
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.demo);
    		String content = getIntent().getStringExtra("msg");
    		Toast.makeText(getApplicationContext(), content, 0).show();
    	}
    }
    
    事件结果就是打印显示一行土司。

    运行看看自定义通知吧!效果图如下:



  • 相关阅读:
    著名的小退问题
    Oracle学习笔记(十二)
    Oracle学习笔记(十一)
    Oracle学习笔记(十)
    Oracle学习笔记(九)
    Oracle学习笔记(八)
    Oracle学习笔记(七)
    Oracle学习笔记(六)
    Oracle学习笔记(五)
    Oracle学习笔记(四)
  • 原文地址:https://www.cnblogs.com/wanghang/p/6299549.html
Copyright © 2020-2023  润新知