天天看点

自定义通知与系统通知的学习(详解)

    因为有需求要做非系统通知,所以小马找个时间干脆一起学习了系统默认的通知与自定义通知的实现,吼吼,虽然简单,但开心呀,不多讲,老规矩,先看效果再来看代码:

一:应用刚启动时:

<a target="_blank" href="http://blog.51cto.com/attachment/201201/155450862.png"></a>

二:查看系统默认接收到通知时的效果图:

<a target="_blank" href="http://blog.51cto.com/attachment/201201/155502337.png"></a>

三:自定义通知小提示效果图:

<a target="_blank" href="http://blog.51cto.com/attachment/201201/155521729.png"></a>

四:自定义通知布局与系统默认布局对比

<a target="_blank" href="http://blog.51cto.com/attachment/201201/155531649.png"></a>

     有了效果图后再后代码就简单多了,直接看看代码,小马就直接在源代码里面加了注释,有不妥之处还请朋友们提出来 :

package com.xiaoma.www.demo; 

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.view.View; 

import android.view.View.OnClickListener; 

import android.widget.Button; 

/**   

 * @Title: NotificationDemoActivity.java 

 * @Package com.xiaoma.www.demo 

 * @Description: 通知控制类 

 * @author MZH 

 */ 

public class NotificationDemoActivity extends Activity { 

    private Button clearBtn ; 

    private NotificationManager manager ; 

    /** Called when the activity is first created. */ 

    @Override 

    public void onCreate(Bundle savedInstanceState) { 

        super.onCreate(savedInstanceState); 

        setContentView(R.layout.main); 

        init(); 

    } 

    /** 

     * 初始化方法实现 

     */ 

    private void init(){ 

        //步骤一:取得系统服务 

        manager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE); 

        //步骤二: 

        Notification notification = new Notification(R.drawable.notification, 

                "收到小马通知测试", System.currentTimeMillis()); 

        /** 

         * 小马在这个地方写下为什么要在用到通知的时候要创建PendingIntent对象,是因为 

         * Notification可以与应用程序脱离,即便应用程序关闭,Notification仍然 

         * 会显示在状态栏中,当应用程序再次启动后,又可以重新控制这些Nofication消息, 

         * 如清除或替换它们,因为才创建的此对象,更神奇的是这个对象由安卓系统本身维护哦,所以 

         * 在应用关闭后这个对象是不会被翻译掉的 

         */ 

        //步骤三: 

        Intent intent = new Intent(); 

        intent.putExtra("Msg", "这是从Notification传递过来的信息"); 

        intent.setClass(this, NotificationDemoTest.class); 

        PendingIntent contentIntent = PendingIntent.getActivity(this, 0,intent, 0); 

        //步骤四:setLatestEventInfo通过标准的方式将我们的通知设置到指定的View中 

        notification.setLatestEventInfo(this, "通知测试哦", "这是通知的主内容", contentIntent); 

        //写下面这句话的时候大家注意下不要忘了加震动权限,不然没法调用硬件 

        //notification.defaults = Notification.DEFAULT_VIBRATE; 

        //下面这句是把当前的通知设置永久保存的Notification,好暴力呀,吼吼 

        //notification.flags = Notification.FLAG_NO_CLEAR 

        //下面这句是指:如果要让其它的软件检测到永久保存的通知时可以这样写 

        //Notification.flags = Nofication.FLAG_ONGOING_EVENT; 

         * 在这一步需要指定标识Notification的唯一ID,这个ID必须相对于同一个 

         * NoficationManager对象是唯一的,否则就会覆盖相同ID的Notification 

        //步骤五: 

        manager.notify(R.drawable.notification, notification); 

        clearBtn = (Button)findViewById(R.id.button1); 

        clearBtn.setOnClickListener(new OnClickListener() { 

            @Override 

            public void onClick(View v) { 

                manager.cancel(R.drawable.notification); 

                //清除所有通知: 

                //manager.cancelAll(); 

            } 

        }); 

    再来看下接收上面这个通知通过Intent发给第二个Activity的代码,虽然很简单,但有这个后,大家就可以随便更改系统级的通知咯,不用老是用系统很死板很统一的布局,写出自己的个性啦,吼吼,加油加油,看代码了:

import android.widget.RemoteViews; 

import android.widget.Toast; 

* @Title: NotificationDemoTest.java 

* @Package com.xiaoma.www.demo 

* @Description: 接收并弹出通知传递过来的信息 

* @author MZH 

*/ 

public class NotificationDemoTest extends Activity { 

    //声明变量 

    private Button selfBtn; 

    protected void onCreate(Bundle savedInstanceState) { 

        // TODO Auto-generated method stub 

        setContentView(R.layout.maintwo); 

        Intent i = this.getIntent(); 

        String msg = i.getStringExtra("Msg"); 

        if(!"".equals(msg)){ 

            Toast.makeText(this, msg, Toast.LENGTH_SHORT).show(); 

        }else{ 

            Toast.makeText(this, "未接收到任何短信", Toast.LENGTH_SHORT).show(); 

        } 

        selfBtn = (Button)findViewById(R.id.button2); 

        selfBtn.setOnClickListener(new OnClickListener() { 

                sendNotification(); 

    private void sendNotification(){ 

         * 下面还是五个步骤,呵呵,跟前面那个Activity是一样的,只是通知布局不同咯,用RemoteViews加载 

        Notification notification = new Notification(R.drawable.ic_launcher, 

                "这是自定义通知的信息哦", System.currentTimeMillis()); 

        PendingIntent pendingIntent = PendingIntent.getActivity(this, 1, getIntent(), 1); 

         * RemoteViews这个类的官方文档解释为: 

         *   很直接很简单的讲就是:从我们自己的XML文件中加载一个VIEW到通知中    

        RemoteViews rViews = new RemoteViews(getPackageName(), R.layout.notification); 

        rViews.setTextViewText(R.id.textView, "更新自定义内容"); 

        notification.contentView = rViews; 

        notification.contentIntent = pendingIntent; 

        //notification.setLatestEventInfo(this, "这是通知的标题", "这是通知的正文", pendingIntent); 

        manager.notify(1, notification); 

     这个代码虽然很简单,但小马想通过自己的积累,哪怕每天积累一点点知识点,足矣,吼吼,记录下自己成长的过程,如果朋友们对我的小DEMO有什么好的建议请直接跟小马讲,一定向各位虚心学习,先谢谢啦,最后 ,老样子,这个小DEMO的源码小马还是会放到附件中去,希望朋友们发现问题请直接指出,谢谢

<a href="http://down.51cto.com/data/2359705" target="_blank">附件:http://down.51cto.com/data/2359705</a>

     本文转自华华世界 51CTO博客,原文链接:http://blog.51cto.com/mzh3344258/767219,如需转载请自行联系原作者

继续阅读