Android开发学习之路--Notification之初体验

一般当我们收到短信啊,微信啊,或者有些app的提醒。我们都会在通知栏收到一天简单的消息,然后点击消息进入到app里面,事实上android中有专门的Notification的类能够完毕这个工作,这里就实现下这个功能。

首先新建NotificationTestproject,然后加入一个button,用来触发通知。然后编写代码例如以下:

package com.example.jared.notificationtest;

import android.app.NotificationManager;
import android.os.Bundle;
import android.support.v4.app.NotificationCompat;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

    private Button sendNotificationBtn;

    private int mId = 1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        sendNotificationBtn = (Button)findViewById(R.id.sendNotification);
        sendNotificationBtn.setOnClickListener(new myOnClickListener());
    }

    private class myOnClickListener implements View.OnClickListener {
        @Override
        public void onClick(View view) {
            switch (view.getId()) {
                case R.id.sendNotification:
                    setSendNotificationBtn();
                    break;
                default:
                    break;
            }
        }
    }

    public void setSendNotificationBtn () {
        NotificationCompat.Builder notification = new NotificationCompat.Builder(this)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentTitle("My Notification")
                .setContentText("Hello Notification");
        NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        manager.notify(mId, notification.build());
    }
}

这里了用了NotificatonCompat.Builder来创建一个简单的Notification,setSmallIcon是指定当中的图标,setContentTitle方法是指定标题,setContentText指定内容,然后通过getSystemService获取通知的管理类,通过notify方法发送通知,当中mId是一个id号,每个通知有其独特的通知号。不能反复。

执行效果例如以下所看到的:

接着我们来实现点击通知后跳转到相应的Activity中,然后消除这条通知。再创建一个Activity,布局例如以下:

<?xml version="1.0" encoding="utf-8"?

>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.jared.notificationtest.Notification">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="欢迎点击通知事件!"
        android:layout_margin="20dp"
        android:textSize="20dp"/>
</LinearLayout>

这里就一个textview用来显示下信息,接着编写代码例如以下:

package com.example.jared.notificationtest;

import android.app.NotificationManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class Notification extends AppCompatActivity {

    private int mId = 1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_notification);
        NotificationManager manager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
        manager.cancel(mId);
    }
}

这里进入到Activity后就把通知清除掉,接着就是改动MainActivity代码:

package com.example.jared.notificationtest;

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.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

    private Button sendNotificationBtn;

    private int mId = 1;
    private int numMessage = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        sendNotificationBtn = (Button)findViewById(R.id.sendNotification);
        sendNotificationBtn.setOnClickListener(new myOnClickListener());
    }

    private class myOnClickListener implements View.OnClickListener {
        @Override
        public void onClick(View view) {
            switch (view.getId()) {
                case R.id.sendNotification:
                    setSendNotificationBtn();
                    break;
                default:
                    break;
            }
        }
    }

    public void setSendNotificationBtn () {
        NotificationCompat.Builder notification = new NotificationCompat.Builder(this)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentTitle("My Notification")
                .setContentText("Hello Notification")
                .setNumber(++numMessage);

        Intent intent = new Intent(this, Notification.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent,
                PendingIntent.FLAG_CANCEL_CURRENT);
        notification.setContentIntent(pendingIntent);

        NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        manager.notify(mId, notification.build());
    }
}

这里又加入了setNumber方法。主要是显示来了几条通知,比方微信中就须要知道,然后实例化了一个intent。再实例化一个pendingIntent。获取activity,在NotificationCompat.Builder里setContentIntent。之后就能够达到我们的效果,执行并点击通知例如以下所看到的:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" width="200" height="350" > 
     

如上所看到的收到了6条通知,然后点击后通知也消除了。

一般在下载歌曲啊。图片啊的时候。会有进度条表示下载的过程,这里来模拟实现下这个功能。改动MainAcitivy代码例如以下:

package com.example.jared.notificationtest;

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.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";

    private Button sendNotificationBtn;

    private int mId = 1;
    private int numMessage = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        sendNotificationBtn = (Button)findViewById(R.id.sendNotification);
        sendNotificationBtn.setOnClickListener(new myOnClickListener());
    }

    private class myOnClickListener implements View.OnClickListener {
        @Override
        public void onClick(View view) {
            switch (view.getId()) {
                case R.id.sendNotification:
                    setSendNotificationBtn();
                    break;
                default:
                    break;
            }
        }
    }

    public void setSendNotificationBtn () {
         final NotificationCompat.Builder notification = new NotificationCompat.Builder(this)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentTitle("Music Download")
                .setContentText("burning.mp3")
                .setNumber(++numMessage);

        Intent intent = new Intent(this, Notification.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent,
                PendingIntent.FLAG_CANCEL_CURRENT);
        notification.setContentIntent(pendingIntent);

        final NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        new Thread(
                new Runnable(){
                    @Override
                    public void run() {
                        for(int cnt=0; cnt<=100; cnt++){
                            notification.setProgress(100, cnt, false);
                            manager.notify(mId, notification.build());
                            try {
                                Thread.sleep(200);
                            } catch (InterruptedException e) {
                                Log.d(TAG, "Sleep failure");
                            }
                        }
                        notification.setContentText("Download complete");
                        notification.setProgress(0, 0, false);
                        manager.notify(mId, notification.build());
                    }
                }
        ).start();
    }
}

这里通过setProgress方法来实现,这里开了一个Thread,当下载完毕后又一次设置下内容。

执行结果例如以下:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" width="200" height="350" > 
   

图1显示运行进度条在走,图2完毕了下载功能。

一般收到通知,手机都会有一段声音。加上震动。那么接下来来实现这个功能。上图,假设下载完毕后,就放一段音乐而且震动,改动代码例如以下:

package com.example.jared.notificationtest;

import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.NotificationCompat;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import java.io.File;

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";

    private Button sendNotificationBtn;

    private int mId = 1;
    private int numMessage = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        sendNotificationBtn = (Button)findViewById(R.id.sendNotification);
        sendNotificationBtn.setOnClickListener(new myOnClickListener());
    }

    private class myOnClickListener implements View.OnClickListener {
        @Override
        public void onClick(View view) {
            switch (view.getId()) {
                case R.id.sendNotification:
                    setSendNotificationBtn();
                    break;
                default:
                    break;
            }
        }
    }

    public void setSendNotificationBtn () {
         final NotificationCompat.Builder notification = new NotificationCompat.Builder(this)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentTitle("Music Download")
                .setContentText("burning.mp3")
                .setNumber(++numMessage);

        Intent intent = new Intent(this, Notification.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent,
                PendingIntent.FLAG_CANCEL_CURRENT);
        notification.setContentIntent(pendingIntent);

        final NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        new Thread(
                new Runnable(){
                    @Override
                    public void run() {
                        for(int cnt=0; cnt<=100; cnt++){
                            notification.setProgress(100, cnt, false);
                            manager.notify(mId, notification.build());
                            try {
                                Thread.sleep(100);
                            } catch (InterruptedException e) {
                                Log.d(TAG, "Sleep failure");
                            }
                        }
                        notification.setContentText("Download complete");
                        notification.setProgress(0, 0, false);
                        Uri soundUri = Uri.fromFile(new File("/system/media/audio/animationsounds/bootSound.ogg"));
                        notification.setSound(soundUri);
                        long[] vibrates = {0, 1000, 1000, 1000};
                        notification.setVibrate(vibrates);
                        manager.notify(mId, notification.build());
                    }
                }
        ).start();
    }
}

这里加上了setSound和setVibrate方法,而且须要在AndroidManifest中加入权限:

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

这里的歌曲名是通过adb shell查看系统的存在的音乐:

下载到手机执行后就能够观察效果。

当然还能够控制led灯,不知为啥led灯的效果一直没有,网上翻阅非常多资料也没找到问题所在,若有朋友知道。麻烦告知一二不甚感激。

 notification.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION));
                        long[] vibrates = {0, 1000, 1000, 1000};
                        notification.setVibrate(vibrates);
                        notification.setLights(Color.GREEN, 1000, 1000);

关于Notification基本上就学到这里了。

时间: 2024-12-26 19:10:43

Android开发学习之路--Notification之初体验的相关文章

Android开发学习之路--Broadcast Receiver初体验

学习了Activity组件后,这里再学习下另一个组件Broadcast Receiver组件.这里学习下自定义的Broadcast Receiver.通过按键自己发送广播,然后自己接收广播.新建MyBroadcastReceiver,代码如下: package com.example.jared.broadcasttest; import android.content.BroadcastReceiver; import android.content.Context; import andro

Android开发学习之路--React-Native之初体验

??近段时间业余在学node.js,租了个阿里云准备搭建后端,想用node.js,偶尔得知react-native可以在不同平台跑,js在iOS和android上都可以运行ok,今天就简单学习下react-native.(这里的开发环境是mac,windows和linux可能会有所不同,而且跑ios也需要mac的). 安装react-native ??首先是安装react-native了,这里首先是已经安装好了node,并且也安装好了npm了,关于node和npm就只能google了,不过之后我

Android开发学习之路--RxAndroid之初体验

学了一段时间android,看了部分的项目代码,然后想想老是学基础也够枯燥乏味的,那么就来学习学习新东西吧,相信很多学java的都听说过RxJava,那么android下也有RxAndroid. RxJava最核心的两个东西是Observables(被观察者,事件源)和Subscribers(订阅者).Observables发出一系列事件,Subscribers处理这些事件.这里的事件可以是任何你感兴趣的东西,触摸事件,web接口调用返回的数据等等. 关于RxAndroid的github:htt

Android开发学习之路--网络编程之xml、json

一般网络数据通过http来get,post,那么其中的数据不可能杂乱无章,比如我要post一段数据,肯定是要有一定的格式,协议的.常用的就是xml和json了.在此先要搭建个简单的服务器吧,首先呢下载xampp,然后安装之类的就不再多讲了,参考http://cnbin.github.io/blog/2015/06/05/mac-an-zhuang-he-shi-yong-xampp/.安装好后,启动xampp,之后在浏览器输入localhost或者127.0.0.1就可以看到如下所示了: 这个就

android开发学习之路——连连看之游戏逻辑(五)

GameService组件则是整个游戏逻辑实现的核心,而且GameService是一个可以复用的业务逻辑类. (一)定义GameService组件接口 根据前面程序对GameService组件的依赖,程序需要GameService组件包含如下方法.   ·start():初始化游戏状态,开始游戏的方法.     ·Piece[][] getPieces():返回表示游戏状态的Piece[][]数组.     ·boolean hasPieces():判断Pieces[][]数组中是否还剩Piec

Android开发学习之路-RecyclerView滑动删除和拖动排序

Android开发学习之路-RecyclerView使用初探 Android开发学习之路-RecyclerView的Item自定义动画及DefaultItemAnimator源码分析 Android开发学习之路-下拉刷新怎么做? 本篇是接着上面三篇之后的一个对RecyclerView的介绍,这里多说两句,如果你还在使用ListView的话,可以放弃掉ListView了.RecyclerView自动帮我们缓存Item视图(ViewHolder),允许我们自定义各种动作的动画和分割线,允许我们对It

Android开发学习之路-该怎么学Android(Service和Activity通信为例)

在大部分地方,比如书本或者学校和培训机构,教学Android的方式都基本类似,就是告诉先上原理方法,然后对着代码讲一下. 但是,这往往不是一个很好的方法,为什么? ① 学生要掌握这个方法的用途,只能通过记忆而不是理解 ② 当某些原理稍微复杂的时候,通过讲解是不能直接理解的,有时候下课回去了再看也不一定看得明白 ③ 对英语文档不够重视,有问题先百度 本鸟自学Android一年,慢慢也学习到了很多的方法,如果你也是一个入门不久但是觉得很多东西都不明白的新手,希望本文对你有帮助. 我觉得要想学好And

Android开发学习之路-环境搭建

这里选择使用android studio 集成开发环境,因为as是google推出的单独针对android开发的环境,并且迭代周期很快,因此,肯定会替代eclipse成为andorid的开发环境.对于没有eclipse基础的我来说,可以直接从as开始学习. 搭建环境, 1. 下载as withiout SDK 2. 导入自己的SDK库 3. 这里要求必须联网,而且,必须是可以FQ的,要不然速度会很慢. 4.SDK manager 如果速度比较慢,可以打开option勾选force http选项,

Android开发学习之路--Content Provider之初体验

天气说变就变,马上又变冷了,还好空气不错,阳光也不错,早起上班的车上的人也不多,公司来的同事和昨天一样一样的,可能明天会多一些吧,那就再来学习android吧.学了两个android的组件,这里学习下第三个android的组件,Content Provider内容提供器. Content Provider向我们提供了在不同应用程序之间的数据共享,比如微信啊,支付宝啊,想要获取手机联系人的信息,而手机联系人是另一个应用程序,那么这时候就需要用到Content Provider了.Content P