安卓学习之通知(Notification)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了安卓学习之通知(Notification)相关的知识,希望对你有一定的参考价值。

  安卓中创建通知需要借助NotificationManager来对通知进行管理。可以调用Context的getsSystemService()方法来获得。 getsSystemService()方法接收一个参数,这个参数是字符串,用于指定哪一个服务。Context.NOTIFICATION_SERVICE 就是指定通知服务。 这个方法返回一个Object对象,所欲需要进行强制转换。

NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
  • 创建Notification对象

  1.安卓API Level 11 以下

Notification notification = new Notification(R.drawable.ic_launcher, "This is ticker text", System.currentTimeMillis());

安卓文档中写了 Notification(int icon, CharSequence tickerText, long when)  This constructor was deprecated in API level 11. Use Notification.Builder instead.  

也就是说在安卓API Level 11 以上这种方法创建Notification已经无效了。

  2.高于安卓API Level 11 低于 API Level 16

  用Notification.Builder来构建,可以用getNotification()来获取Notification对象。不过文档中写了getNotification() This method was deprecated in API level 16. Use build() instead.

也就是说getNotification()方法获得Notification对象在安卓API Level 16以上已经无效。

  3.高于安卓API Level 16

  使用Notification.Builder来构建,调用Builder的build()来获取对象。

  • Notification设置布局

  Notification.Builder有很多方法来构建通知的布局。这里给出一段代码:

package com.example.notificationtest;

import java.io.File;

import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity implements OnClickListener{

    private Button sendNotice;
    private int num;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        num = 0;
        setContentView(R.layout.activity_main);
        sendNotice = (Button) findViewById(R.id.send_notice);
        sendNotice.setOnClickListener(this);
    }
    
    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        switch (v.getId()) {
        case R.id.send_notice:
            Intent intent = new Intent(MainActivity.this,NotificationActivity.class);
            intent.putExtra("id", ++num);
            
            //跳转的Intent 第一个参数Context 第二个参数文档解释Private request code for the sender 
            //第三个参数intent 第四个参数flags
            PendingIntent pi = PendingIntent.getActivity(this, 0, intent,
                    PendingIntent.FLAG_UPDATE_CURRENT);
            //调用提示音
            Uri soundUri = Uri.fromFile(new File("/system/media/audio/ringtones/01_Piano.ogg"));
            //调用震动 是一个long型的数组第0个表示几秒后震动 第1个数震动多久 第2个数等待多久 依次类推
            long[] vibrates = {0,100};
            
            NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
            Notification notification = new Notification.Builder(this)
                    .setDefaults(Notification.DEFAULT_ALL)    //通知默认的声音 震动 呼吸灯 
                    .setTicker("This is Ticker")            //状态栏显示的文字
                    .setContentTitle("This is title")        //设置下拉栏中通知的第一行
                    .setContentText("This is Text")            //设置下拉栏中通知的第二行
                    .setSubText("This is SubText")          //设置下拉栏中通知的第三行
                    .setSmallIcon(R.drawable.ic_launcher)    //设置状态栏的小图标
                    //.setLargeIcon(b)                         //设置下拉栏中的大图标
                    .setContentIntent(pi)                    //跳转的Intent
                    .setSound(soundUri)                        //设置通知音效
                    .setVibrate(vibrates)                    //设置震动效果
                    .build();                                //构建Notification
            manager.notify(num,notification);                //显示notification 第一个参数表示id值
            break;

        default:
            break;
        }
    }
}

 

 

震动需要在AndroidManifest.xml中加入声明 :

<uses-permission android:name="android.permission.VIBRATE" />

 

我们通过通知进入到另外一个活动中时,需要将通知从状态栏上除去。可以在启动的活动中调用NotificationManager的cancel()方法,接收1个参数,即该通知的id值。

  • PendingIntent.getActivity()方法第四个参数值:

  FLAG_UPDATE_CURRENT:如果PendingIntent已经存在,保留它并且只替换它的extra数据。会更新之前PendingIntent的消息,比如,你推送了消息1,并在其中的Intent中putExtra了一个值“ABC”,在未点击该消息前,继续推送第二条消息,并在其中的Intent中putExtra了一个值“CBA”,好了,这时候,如果你单击消息1或者消息2,你会发现,他俩个的Intent中读取过来的信息都是“CBA”,就是说,第二个替换了第一个的内容。

  FLAG_CANCEL_CURRENT时:如果PendingIntent已经存在,那么当前的PendingIntent会取消掉,然后产生一个新的PendingIntent依然是上面的操作步骤,这时候会发现,点击消息1时,没反应,第二条可以点击。

  FLAG_ONE_SHOT:PendingIntent只能使用一次。调用了实例方法send()之后,它会被自动cancel掉,再次调用send()方法将失败。

  FLAG_NO_CREATE:如果PendingIntent不存在,简单了当返回null。 

 

 

到这里学习了安卓通知的一般用法。

 

以上是关于安卓学习之通知(Notification)的主要内容,如果未能解决你的问题,请参考以下文章

IOS学习之NSNotificationCenter消息机制

iOS学习之适配iOS10

iOS学习之观察者模式

从零开始学android -- notification通知

安卓学习之FrameLayout

iOS学习之六种传值方式