zoukankan      html  css  js  c++  java
  • 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();
    	}
    }
    
    事件结果就是打印显示一行土司。

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



  • 相关阅读:
    Junit单元测试
    win7的6个网络命令
    WOJ1024 (POJ1985+POJ2631) Exploration 树/BFS
    WOJ1022 Competition of Programming 贪心 WOJ1023 Division dp
    woj1019 Curriculum Schedule 输入输出 woj1020 Adjacent Difference 排序
    woj1018(HDU4384)KING KONG 循环群
    woj1016 cherry blossom woj1017 Billiard ball 几何
    woj1013 Barcelet 字符串 woj1014 Doraemon's Flashlight 几何
    woj1012 Thingk and Count DP好题
    woj1010 alternate sum 数学 woj1011 Finding Teamates 数学
  • 原文地址:https://www.cnblogs.com/wanghang/p/6299549.html
Copyright © 2011-2022 走看看