zoukankan      html  css  js  c++  java
  • Android笔记——横幅通知

    通知分为三种:下拉通知、锁屏通知、横幅通知。前两个通知内容是相同的,横幅通知的View需要单独定制(还有一种是只在通知栏出现一句话)

    一般的app,只会默认开启“下拉通知”的权限。其他两个通知需要用户手动去在设置中开启。只有系统级apk(如通话、短信)或者高频使用的apk(如微信、QQ)会三个权限都开启。【注:因为本人只用过华为的手机,其他ROM厂商和Google的规则不是很清楚】。一般来说在下拉通知和锁屏通知显示的内容是一样的,只是普通的apk需要用户在设置中单独开启权限才能看到锁屏/横幅通知。锁屏/横幅通知是Android5.0才引入的。感兴趣的可以百度自己搜索一下效果。这里博主随便找了一个:http://www.360doc.com/content/15/0205/15/21857071_446464870.shtml。

    锁屏通知不需要单独的绘制,内容和正常的下拉通知一样;横幅通知的View必须要单独绘制,出于美观,一般也不会与下拉/锁屏设置的相同。下面就来简单讲解一下通知(Notification)的用法。

    1. 首先我们需要一个获取通知管理器(NotificationManager):

     1 import android.app.Notification;
     2 import android.app.NotificationManager;
     3 
     4 public class MainActivity extends AppCompatActivity {
     5     private NotificationManager notificationManager;
     6 
     7     @Override
     8     protected void onCreate(Bundle savedInstanceState) {
     9         super.onCreate(savedInstanceState);
    10         notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    11     }

    2. 然后我们需要通过Notification.Builder创建一个通知并显示:

     1     private void sendNotification() {
     2         Notification.Builder nb = new Notification.Builder(this);
     3         PendingIntent pendingIntent = PendingIntent.getActivity(this, 0,
     4                 new Intent(this, MainActivity.class), 0);   // 设置一个不是马上调用的PendingIntent,和Intent类似
     5         nb.setSmallIcon(R.mipmap.ic_launcher)               // 设置状态栏里的小图标
     6         .setWhen(System.currentTimeMillis())                // 设置时间发生时间
     7         .setAutoCancel(true)                                // 设置可以清除
     8         .setContentTitle("This is ContentTitle")            // 设置下拉列表里的标题
     9         .setContentText("this is ContentText")              // 设置下拉列表里的说明
    10         .setTicker("这个通知只有一句话,在通知栏上")             // 设置一句话通知
    11         .setContentIntent(pendingIntent)                    // 点击通知则执行pendingIntent,跳转到MainActivity
    12         .setContent(getRemoteViews2());                     // 设置下拉通知栏(会让标题、说明、图标无效)
    13         Notification n = nb.build();                        // 获取一个Notification
    14         n.defaults = Notification.DEFAULT_SOUND;            // 设置为默认的声音
    15         n.headsUpContentView = getRemoteViews();            // 设置横幅通知
    16         notificationManager.notify(NOTIFICATION_ID, n);     // 显示通知
    17     }

    第10行的setTicker()其实就是上面的提到过的一句话通知,相当于横幅通知的“简略版”;

    第11行的setContentIntent()是设置点击通知跳转到MainActivity,由于不是马上执行,所以使用的是PendingIntent;

    第12行的setContent()是使用定制的通知界面,而不是现有的框架,这条语句会让之前设置的标题、说明、图标无效,以这个为准;

    第15行的headsUpContentView就是横幅通知了,它和setContent()的参数的类型一样,都是RemoteViews。

     1     private RemoteViews getRemoteViews() {
     2         RemoteViews views = new RemoteViews(getApplicationContext().getPackageName(), R.layout.headupview);
     3         // 这里可以设置按钮监听,待补充
     4         return views;
     5     }
     6 
     7     private RemoteViews getRemoteViews2() {
     8         RemoteViews views = new RemoteViews(getApplicationContext().getPackageName(), R.layout.notificationview);
     9         // 这里可以设置按钮监听,待补充
    10         return views;
    11     }

    3. 布局实现(headupview)

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                    android:layout_width="match_parent"
                    android:layout_height="64dp"
                    android:layout_marginStart="12dp"
                    android:layout_marginTop="12dp" >
    
        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/imageView"
            android:src="@mipmap/icon" />
    
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="啦啦啦,我是标题(∩_∩)"
            android:textSize="12sp"
            android:id="@+id/textView"
            android:layout_alignParentTop="true"
            android:layout_marginStart="10dp"
            android:layout_marginTop="11dp"
            android:layout_toEndOf="@+id/imageView"/>
    
        <Button
            android:layout_width="132dp"
            android:layout_height="33dp"
            android:text="取消"
            android:id="@+id/button3"
            android:textSize="12sp"
            android:layout_below="@id/textView"
            android:layout_toEndOf="@id/imageView"
            android:layout_marginStart="10dp"
            android:layout_gravity="center_vertical"/>
    
        <Button
            android:layout_width="132dp"
            android:layout_height="33dp"
            android:text="同意"
            android:id="@+id/button4"
            android:layout_below="@id/textView"
            android:layout_marginStart="9dp"
            android:layout_toEndOf="@id/button3"
            android:textSize="12sp"/>
    
    </RelativeLayout>

    布局实现(notificationview):

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                    android:layout_width="match_parent"
                    android:layout_height="64dp"
                    android:layout_marginStart="2dp"
                    android:layout_marginTop="1dp" >
    
        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/imageView"
            android:src="@mipmap/icon" />
    
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="啦啦啦,我是标题(∩_∩)"
            android:textSize="12sp"
            android:id="@+id/textView"
            android:layout_alignParentTop="true"
            android:layout_marginStart="10dp"
            android:layout_marginTop="11dp"
            android:layout_toEndOf="@+id/imageView"/>
    
        <Button
            android:layout_width="112dp"
            android:layout_height="33dp"
            android:text="取消"
            android:id="@+id/button3"
            android:textSize="12sp"
            android:layout_below="@id/textView"
            android:layout_toEndOf="@id/imageView"
            android:layout_marginStart="10dp"
            android:layout_gravity="center_vertical"/>
    
        <Button
            android:layout_width="112dp"
            android:layout_height="33dp"
            android:text="同意"
            android:id="@+id/button4"
            android:layout_below="@id/textView"
            android:layout_marginStart="9dp"
            android:layout_toEndOf="@id/button3"
            android:textSize="12sp"/>
    
    </RelativeLayout>

    很多知识点没有补全,未完待续……

    推荐阅读以下这个,超级全:

    http://blog.csdn.net/loongggdroid/article/details/17616509/

  • 相关阅读:
    ipad与windows互传文件(不需要安装app)
    为WordPress所有的Tags标签添加Nofollow
    为什么应该用网站来替代电商平台是开网店?
    实体转JSON时,值为null的字段丢失问题
    finally 与 return
    URI, URL, and URN
    HTTP
    EasyPoi 一对多数据导入 null值问题
    热点探测
    elasticsearch数据操作02
  • 原文地址:https://www.cnblogs.com/clevercong/p/5375114.html
Copyright © 2011-2022 走看看