安卓学习之通知(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。 

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

时间: 2024-10-05 16:46:04

安卓学习之通知(Notification)的相关文章

Android学习--使用通知

通知 安卓和苹果一样,在App进去后台之后,当你需要给客户发送一些消息提醒之类的东西就得使用到通知这个东西,安卓中的通知显然是要比苹果的简单一点,苹果的在通知这方面主要展示在远程推送和本地通知上面,这里我们就简单的说说安卓的本地的通知的以及基本的展示,远程推送的东西在后面涉及到的时候再做总结,先看看下面这个的一个运行效果图,这是我在自己的安卓测试机上看到的效果,其他的就没什么说的,代码中需要注意的东西在代码注释记录的很清楚,就直接上代码: 通知 // 这里注意一下PendingIntent和In

使用Google Cloud Messaging (GCM),PHP 开发Android Push Notifications (安卓推送通知)

什么是GCM? Google Cloud  Messaging (GCM) 是Google提供的一个服务,用来从服务端向安卓设备发送推送通知. GCM分为客户端和服务端开发. 这里我们只介绍服务端开发.其实过程非常简单,只需利用PHP发送POST数据. api key的取得? 待补充? class GCM { public $api_key = "AIzaSyAU3wZs9raik-mHQ"; function __construct() { } /** * Sending Push

从零开始--系统深入学习android(实践-让我们开始写代码-Android框架学习-7.通知)

通知 一个通知是一条消息他是显示于你应用程序之外的一个界面中.当你告诉系统要发布一个通知时,它首先作为一个icon出现在通知区域.为了看见通知的细节,用户可以点击通知区域展开一个新的界面.下面让我们来看一下图7-1和图7-2: 图7-1 通知出现在通知区域 图7-2 通知展开后的效果(drawer) 注意:除非特别注明外,本章指的都是NotificationCompat.Builder,它在v4 Support Library中有,正式添加于API Level 15.但有了v4 Support

安卓学习-界面-布局-RelativeLayout

RelativeLayout相对布局,所有内部的组件都是相对的 XML属性 XML属性 函数 说明 android:gravity setGravity 内部组件的对其方式 android:ignoreGravity setIgnoreGravity 设置哪个组件不受Gravity影响 RelativeLayout.LayoutParams用来设置内部组件的对齐方式 XML属性 说明 android:layout_centerHorizontal 水平居中 android:layout_cent

安卓学习第13课——BaseAdapter

BaseAdapter创建这么一个对象,需要些四个方法. int getCount(); Object getItem(int position); long getItemId(int position);View getView(int position, View convertView, ViewGroup parent);(1)列表中的项数(2)返回值的列表内容(3)获得postion处的列表项的ID(4)该列表项里的组件 package com.example.baseadapter

深入浅出安卓学习相关知识,如何从零学好移动开发

原文发表自我的个人主页,欢迎大家访问 http://purplesword.info/mobile-develop 由于近几年来互联网的飞速发展,安卓和iOS平台的大量普及推广,移动开发在当前是非常热门的一个方向. 有不少同学问我如何学习安卓,要学些什么,难不难学.之前一直没有想好应该怎么回答这个问题,只是简单的说安卓自身门槛不高,并不难学.因为我觉得准确回答一个类似这样的问题往往需要灵感.现在根据我的学习体验,做个大概的总结. 1.我为什么学安卓 我从刚开始接触安卓开发到现在也有两三年的时间了

通知 Notification 详解

效果 通知栏-刚收到通知时 通知栏-收到通知几秒后 标准视图 大视图-下滑前是标准视图 大视图-下滑后显示大视图 自定义通知 讲解 Notification,俗称通知,是一种具有全局效果的通知,它展示在屏幕的顶端,首先会表现为一个图标的形式,当用户向下滑动的时候,展示出通知具体的内容. 注意:因为一些Android版本的兼容性问题,对于Notification而言,Android3.0是一个分水岭,在其之前构建Notification推荐使用Notification.Builder构建,而在An

安卓学习第12课——SimpleAdapter

SimpleAdapter一点也不简单,他的参数就带了5个,天哪,晕了.. 今天学的这个适配器, public SimpleAdapter(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to) 看这个大概明白,参数分别是第一个:表示访问整个android应用程序接口,基本上所有的组件都需要,一般都写this(改天研究一下),第二个应该是这个List对象

安卓学习第9课——计时器chronometer

今天学习了钟表及计时器.. 我觉得AnalogClock和DigitalClock直接使用就可以.唯一需要知道的就是AnalogClock是可以修改表盘和分针时针的. 方法是android:dail及android:hand_minute和hand_hour. 下面介绍的是计时器的用法. 首先xml中只要放入一个chronometer和一个按钮即可.为的是是点击启动按钮,开始计时,20s停止. package com.example.chronometer; import android.app