精华内容
下载资源
问答
  • Notification

    千次阅读 2017-01-16 11:24:03
    Notification

    简介:

    显示在手机状态栏的通知。Notification所代表的是一种具有全局效果的通知,程序一般通
    过NotificationManager服务来发送Notification。
    Android3.0增加了Notification.Builder类,该类可以轻松地创建Notification对象。
    Notification,俗称通知,是一种具有全局效果的通知,它展示在屏幕的顶端,首先会表现为一个图标的形式,当用户向下滑动的时候,
    展示出通知具体的内容。
      【注意:】因为一些Android版本的兼容性问题,对于Notification而言,Android3.0是一个分水岭,如果不考虑向下兼容的问题,构建Notification使用Notification.Builder构建,如果考虑到向下兼容性的问题,一般推荐使用NotificationCompat.Builder构建(NotificationCompat类在v4包中:android.support.v4.app.NotificationCompat)。

    通知一般通过NotificationManager服务来发送一个Notification对象来完成,NotificationManager是一个重要的系统级服务,该对象位于应用程序的框架层中,应用程序可以通过它像系统发送全局的通知。这个时候需要创建一个Notification对象,用于承载通知的内容。但是一般在实际使用过程中,一般不会直接构建Notification对象,而是使用它的一个内部类NotificationCompat.Builder来实例化一个对象(Android3.0之下使用Notification.Builder),并设置通知的各种属性,最后通过NotificationCompat.Builder.build()方法得到一个Notification对象。当获得这个对象之后,可以使用NotificationManager.notify()方法发送通知。
      NotificationManager类是一个通知管理器类,这个对象是由系统维护的服务,是以单例模式获得,所以一般并不直接实例化这个对象。在Activity中,可以使用Activity.getSystemService(String)方法获取NotificationManager对象,Activity.getSystemService(String)方法可以通过Android系统级服务的句柄,返回对应的对象。在这里需要返回NotificationManager,所以直接传递Context.NOTIFICATION_SERVICE即可。
      虽然通知中提供了各种属性的设置,但是一个通知对象,有几个属性是必须要设置的,其他的属性均是可选的,必须设置的属性如下:
    小图标,使用setSamllIcon()方法设置。
    标题,使用setContentTitle()方法设置。
    文本内容,使用setContentText()方法设置。

    Notification.Builder类中提供的方法:

    builder.setAutoCancel(); 设置点击通知后,状态栏自动删除通知。
    builder.setSmallIcon(R.drawable.alert); 设置通知小图标
    builder.setLargeIcon(R.drawable.alert2); 设置通知大图标
    builder.setContentTitle(“标题”); 设置通知标题
    builder.setContentText(“文本”); 设置通知内容
    builder.setDefaults(Notification.DEFAULT_SOUND
    | Notification.DEFAULT_VIBRATE); 设置通知的音乐、振动、LED等。
    builder.setSound(); 设置通知的音乐
    builder.setTicker(); 设置通知在状态栏的提示文本。第一次提示消息的时候显示在通知栏上。
    builder.setContentIntent(); 设置点击通知后将要启动的程序组件对应的PendingIntent。

    发送Notification的步骤:(四部曲)

    1、调用getSystemService(NOTIFICATION_SERVICE)方法获取系统的NotificationManager服务,它是一个
    重要的系统服务。应用程序可以通过NotificationManager 向系统发送全局通知;
    2、构造Notification.Builder对象;NotificationCompat.Builder构建
    3、设置Notification.Builder对象的各种属性;
    4、通过NotificationManager 的notify()方法发送Notification。

    PendingIntent:

    1、PendingIntent字面意义:等待的,悬而未决的Intent;Intent一般是用作Activity、Sercvice、BroadcastReceiver之间传递数据,而Pendingintent,一般用在 Notification上,可以理解为延迟执行的intent,PendingIntent是对Intent一个包装;
    2、得到一个 PendingIntent 对象,使用方法类的静态方法 getActivity(Context, int, Intent, int);
    3、PendingIntent是一种特殊的Intent。主要的区别在于Intent是立刻执行,而 PendingIntent 的执行不是立刻,而是当条件满足后才发送企图,而且PendingIntent 可以取消;
    4、PendingIntent执行的操作实质上是参数传进来的Intent的操作,使用 PendingIntent 的目的在于它所包含的Intent的操作的执行是需要满足某些条件的。
    5、主要的使用的地方和例子:通知Notification的发送,短消息SmsManager的发送和警报器AlarmManager的执行等。总而言之,PendingIntent就是一个可以在满足一定条件下执行的Intent,它相比于Intent的优势在于自己携带有Context对象,这样他就不必依赖于某个activity才可以存在。

    Intent和PendingIntent的区别

    1. Intent是立即使用的,而PendingIntent可以等到事件发生后触发,PendingIntent可以cancel;
    2. Intent在程序结束后即终止,而PendingIntent在程序结束后依然有效;
    3. PendingIntent自带Context,而Intent需要在某个Context内运行;
    4. Intent在原task中运行,PendingIntent在新的task中运行。
    public class MyIntentService extends IntentService {
        // 后台下载:进度通知
        @Override
        protected void onHandleIntent(Intent intent) {
         NotificationCompat.Builder builder = new NotificationCompat.Builder( this);
            // 做已经下载完毕的通知100%
            // 点中该通知,播放该视频
            Intent myintent = new Intent();
            myintent.setAction(Intent.ACTION_VIEW);
            // 注意拼写video,不然播放不了
            myintent.setDataAndType(Uri.fromFile(new File(filePath)), "video/*");
    
            PendingIntent pendingIntent = PendingIntent.getActivity(this, 100,
                    myintent, PendingIntent.FLAG_ONE_SHOT);
            builder.setContentIntent(pendingIntent);
    
            // 已经下载完毕,通知
            builder.setContentText("已下载100%");
            builder.setContentTitle("下载完毕,点击播放");
            manager.notify(1, builder.build());

    PendingIntent的几个常量:(getActivity(Context, int, Intent, int)方法中的第四个参数)

    1. FLAG_ONE_SHOT : 这个PendingIntent只能使用一次。
    2. FLAG_NO_CREATE : 如果被描述的PendingIntent不存在,那么简单地返回null,而不是创建它。
    3. FLAG_CANCEL_CURRENT : 如果被描述的PendingIntent已经存在,在即将生成一个新的PendingIntent前,当前的一个要被取消。
    4. FLAG_UPDATE_CURRENT :如果被描述的PendingIntent已经存在,那么继续保持它,但它其中的数据会因为新Intent而更新。
      FLAG_CANCEL_CURRENT:如果当前系统中已经存在一个相同的PendingIntent对象,那么就将先将已有的PendingIntent取消,然后重新生成一个PendingIntent对象。
      FLAG_NO_CREATE:如果当前系统中不存在相同的PendingIntent对象,系统将不会创建该PendingIntent对象而是直接返回null。
      FLAG_ONE_SHOT:该 PendingIntent只作用一次。在该PendingIntent对象通过send()方法触发过后,PendingIntent将自动调用 cancel()进行销毁,那么如果你再调用send()方法的话,系统将会返回一个SendIntentException。
      FLAG_UPDATE_CURRENT: 如果系统中有一个和你描述的PendingIntent对等的PendingInent,那么系统将使用该PendingIntent对象,但是会使用新 的Intent来更新之前PendingIntent中的Intent对象数据,例如更新Intent中的Extras。

    Android之Notification的多种用法

    android Notification

    Android 通知栏Notification的整合 全面学习 (一个DEMO让你完全了解它)

    展开全文
  • notification

    2017-05-11 16:51:17
    点击按钮后执行下面的代码 Notification.Builder builder=new Notification.Builder(this); Intent intent=new Intent(this,SecondActivity.class); PendingIntent pendingIntent = PendingInt

    点击按钮后执行下面的代码

    Notification.Builder builder=new Notification.Builder(this);
    Intent intent=new Intent(this,SecondActivity.class);
    PendingIntent pendingIntent = PendingIntent.getActivity(this,0,intent,PendingIntent.FLAG_UPDATE_CURRENT);
    builder.setContentIntent(pendingIntent);
    builder.setSmallIcon(R.mipmap.ic_launcher)
           .setTicker("状态栏标题")
           .setContentTitle("标题")
           .setContentText("内容");
           //API16以下用getNotification(),16及其以上用build()方法
           Notification notification=builder.getNotification();
    notificationManager.notify(0,notification);


    展开全文
  • Notification详解

    千次阅读 2016-10-26 00:54:54
    Notification

    Notification详解

    Notification详解

    1. 创建notification

    Notification.Builder builder = new Notification.Builder(this)
            .setSmallIcon(R.id.icon)
            .setContentTitle("标题")
            .setContentText("详细文本");

    通过Builder模式创建Notification.Builder实例,有了builder对象,可以给它添加各种属性,例如标题,内容,图标等

    2. 定义Action

    给点击Notification后要执行的操作增加一个Intent,由于这个Intent不是马上就执行的,而是有用户触发的,所以Android给这样的Intent提供了一个延迟意图PendingIntent来帮助我们完成这样的操作

    PendingIntent的使用非常简单,只需要在Intent的基础上包装一层就可以了,代码如下所示

    Intent resultIntent = new Intent(this, ResultActivity.class);
    PendingIntent resultPendingIntent = PendingIntent.getActivity(this, 0, resultIntent,
                    PendingIntent.FLAG_UPDATE_CURRENT);

    这样当点击Notification后,就会触发PendingIntent事件,跳转到指定的Activity

    3. 设置点击事件

    builder.setContentIntent(resultPendingIntent);

    注意事项:当点击通知跳转到Activity的时候,Activity会重新走生命周期,想要保持原来的状态,需要给Activity配置一个launchMode = “singleTask”

    4. 发送通知

    通过NotificationManager通知管理器的notify()方法来发送Notification,并给Notification一个id值,这个id会在更新Notification的时候用到

    NotificationManager mNotifyMgr =
            (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    int mNotificationId = 001;
    mNotifyMgr.notify(mNotificationId, builder.build());

    5. 使用BigView样式

    Notification.Builder builder = new Notification.Builder(this)
                    .setSmallIcon(R.drawable.ic_stat_notification)
                    .setContentTitle(getString(R.string.notification))
                    .setContentText(getString(R.string.ping))
                    .setDefaults(Notification.DEFAULT_ALL)
                    .setStyle(new NotificationCompat.BigTextStyle()
                            .bigText(msg))
                    .addAction (R.drawable.ic_stat_dismiss,
                            getString(R.string.dismiss), piDismiss)
                    .addAction (R.drawable.ic_stat_snooze,
                            getString(R.string.snooze), piSnooze);

    6. 显示Notification进度

    int id = 1;
    ...
    NotificationManager mNotifyManager =
            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    Notification.Builder mBuilder = new Notification.Builder(this);
    mBuilder.setContentTitle("Picture Download")
            .setContentText("Download in progress")
            .setSmallIcon(R.drawable.ic_notification);
    
    new Thread(new Runnable() {
                @Override
                public void run() {
                    int i;
    
                    for (i = 0; i <= 100; i+=5) {
                        mBuilder.setProgress(100, i, false);
                        mNotifyManager.notify(id, mBuilder.build());
                        Thread.sleep(5*1000);
                    }
    
                    mBuilder.setContentText("Download complete")
                            .setProgress(0,0,false);
                    mNotifyManager.notify(id, mBuilder.build());
                }
            }
    ).start();

    7. 更新通知

    根据id来更新通知

    8. 自定义通知布局

    Notification的自定义布局通过RemoteViews去实现,调用Notification.Builder的setCustomContentView()方法设置自定义的布局

      //通过RemoteViews来创建自定义的Notification视图
    RemoteViews contentView = new RemoteViews(getPackageName(), R.layout.notification);
    contentView.setTextViewText(R.id.tv, "show me when collapsed");
    
    Notification.Builder builder = new Notification.Builder(this)
                    .setCustomContentView(contentView);

    折叠式Notification

    折叠式Notification 也是一种自定义视图的Notification ,常常用于显示长文本。它拥有两个视图状态, 一个是普通状态下的视图状态, 另一个是展开状态下的视图状态。在Notitication中,使用RemoteViews 来帮助我们创建一个自定义的Notification 视图,代码如下所示。

     //通过RemoteViews来创建自定义的Notification视图
            RemoteViews contentView = new RemoteViews(getPackageName(),R.layout.notification);
            contentView.setTextViewText(R.id.tv,"show me when collapsed");

    悬挂式Notification

    Notification详解

    触发悬挂式的Notification的条件有

    • Activity处于全屏模式
    • Notification拥有很高的优先级
    Notification.Builder builder = new Notification.Builder(this)
                    .setSmallIcon(R.mipmap.ic_launcher)
                    .setPriority(Notification.PRIORITY_DEFAULT)
                    .setCategory(Notification.CATEGORY_MESSAGE)
                    .setContentTitle("Headsup Notification")
                    .setContentText("I am Headsup Notification");
    
    Intent push = new Intent();
    push.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    push.setClass(this,MainActivity.class);
    
    PendingIntent pendingIntent = PendingIntent.getActivity(
            this,0,push,PendingIntent.FLAG_CANCEL_CURRENT);
    
    NotificationManager manager = (NotificationManager) 
            getSystemService(Context.NOTIFICATION_SERVICE);
    manager.notify(1,builder.build());

    Notification的显示等级

    Android 5.x 将Notification分成了三个等级

    • VISIBILITY_PRIVATE:表面只有当没有锁屏的时候才能够显示
    • VISIBILITY_PUBLIC:表明任何情况下都会显示
    • VISIBILITY_SECRET:表明在pin,password等安全锁和没有锁屏的情况下才能够显示

    设置Notification的显示等级

    Notification.Builder builder = new Notification.Builder(this)
                   .setVisibility(Notification.VISIBILITY_PRIVATE);

    9. 创建一个常规的activity延迟意图

    <activity
        android:name=".MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name=".ResultActivity"
        android:parentActivityName=".MainActivity">
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value=".MainActivity"/>
    </activity>

    为Intent创建一个回退栈

    ...
    Intent resultIntent = new Intent(this, ResultActivity.class);
    TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
    // Adds the back stack
    stackBuilder.addParentStack(ResultActivity.class);
    // Adds the Intent to the top of the stack
    stackBuilder.addNextIntent(resultIntent);
    // Gets a PendingIntent containing the entire back stack
    PendingIntent resultPendingIntent =
            stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
    ...
    NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
    builder.setContentIntent(resultPendingIntent);
    NotificationManager mNotificationManager =
            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    mNotificationManager.notify(id, builder.build());

    10. 创建一个特别的activity延迟意图

    <activity
            android:name=".ResultActivity"
        ...
        android:launchMode="singleTask"
        android:taskAffinity=""
        android:excludeFromRecents="true">
    </activity>
    ...
    
    NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
    
    Intent notifyIntent = new Intent(this, ResultActivity.class);
    notifyIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
            | Intent.FLAG_ACTIVITY_CLEAR_TASK);
    
    PendingIntent notifyPendingIntent =
            PendingIntent.getActivity(
                    this,
                    0,
                    notifyIntent,
                    PendingIntent.FLAG_UPDATE_CURRENT
            );
    
    builder.setContentIntent(notifyPendingIntent);
    
    NotificationManager mNotificationManager =
            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    
    mNotificationManager.notify(id, builder.build());

    11、Android 7.0 通知新特性

    在Android N中重新设计了通知,可以达到更容易、更快使用的效果。一些主要的变化包括:

    模板更新:更新了通知模板重点内容和头像。开发者将能够利用的新模板的优势,在他们的代码中实现最低限度的调整。

    捆绑通知:Android N的通知功能也更加人性化,现在会自动将相同应用的通知捆绑在一起,实现分组显示,并且通过两指滑动实现预览,理论上用户可以在通知界面直接阅读邮件等内容。

    直接回复:对于实时通信应用程序,Android系统支持在线回复,使用户可以以短信或短信通知界面内快速、直接响应。

    自定义视图:两个新的 API 让用户在通知中使用自定义视图。

    Notification详解

    Android N 开发者预览版的通知系统中还加入了两个全新的 API 接口:Direct Replies 和 Bundling。前者支持为第三方应用的通知加入快速回复和快捷操作,后者则允许同时发出多条通知的应用进行通知拆分。

    当一款应用完美的适配了 Android N,当收到一条消息时就可以直接在下拉通知抽屉甚至是锁屏中直接呼出输入框进行回复,或是选择事先设定好的快速处理操作(标记为已读、转发等)。而当用户同时收到来自不同联系人的消息时,可以点击知卡片上的通知拆分按钮对已经合并的通知进行拆分,拆分后的通知可以像其他的独立通知一样进行回复和处理。

    当然,现阶段适配了这两个特性的应用屈指可数,除了 Google 的环聊、Messenger 以及 Gmail 等应用以外,目前仅发现第三方 Telegram 客户端 Plus Messenger 支持以上功能。

    面对各种应用的通知推送, Android N取以优先级为核心的通知管理方式,而在 Android N中,通知管理也变得更加简单:只需在需要在相应的通知上左右轻扫便能看见一个设置图标,点击该图标就能在通知上方呼出一个简洁的通知优先级设定界面,在这个界面可以将应用通知设定为“静默显示”、“阻拦所有通知”和“默认”三个等级。

    Notification详解

    如果在”系统界面调谐器 - 其它“中打开了”Show full importance settings”功能,这三个等级又将变为”屏蔽 - 低 - 一般 - 高 - 紧急”5 个,设定的方式也由纵列选项变为左右滑动。这个看似新颖的设计实际上是对现有通知管理操作的一次简化,在 Android 6.0 中需要在两个界面来回跳转才能完成的操作,在Android 7.0只用在一个界面就可以搞定。

    同时,Google 也将其对通知优先级的定义从”幕后”搬到了”台前”,在进行完整的五层次优先级设定时 Google 还会提醒不同优先级所对应的通知效果。最后,勿扰模式也在 Android N 中得到了完善,加入了自动规则并允许用户在“请勿打扰”模式下屏蔽静音通知的弹窗甚至是手机的通知指示灯。

    发送一个通知

    private int i = 0;
    private NotificationManager mNotificationManager;
    private static final String GROUP_NAME = "com.heima.notification_type";
    
    //[1]获取一个NotificationManager
    mNotificationManager = (NotificationManager) getSystemService(
            Context.NOTIFICATION_SERVICE);
    //[2]创建一个Notification
    //[2.1]需要给这个Notification对象指定icon,标题,内容,
    final Notification builder = new NotificationCompat.Builder(this)
            .setSmallIcon(R.mipmap.ic_notification)
            .setContentTitle(getString(R.string.app_name))
            .setContentText("这是一个消息通知")
            .setAutoCancel(true)
            .setGroup(GROUP_NAME)
            .build();
    //[3]发送一个通知 需要指定一个Notification对象和一个id,这个id必须是唯一的
    mNotificationManager.notify(i++, builder);
    updateNotificationSummary(); 

    多个通知放入到一个组内

    //[4]创建一个notification组
    String notificationContent = "传智播客" + i;
    final NotificationCompat.Builder builder = new NotificationCompat.Builder(this)
            .setSmallIcon(R.mipmap.ic_notification)
            .setStyle(new NotificationCompat.BigTextStyle()
                    .setSummaryText(notificationContent))
            .setGroup(GROUP_NAME)
            .setGroupSummary(true);
    final Notification notification = builder.build();
    //[5]发送这个notification组
    mNotificationManager.notify(101, notification); 

    可以回复的通知

    private NotificationManager mNotificationManager;
    //[1]获取一个NotificationManager
    mNotificationManager = (NotificationManager) getSystemService(
            Context.NOTIFICATION_SERVICE);
    //[2]创建remoteInput对象,这个对象指定了这个notification的标题和一个key
    String replyLabel = getResources().getString(R.string.app_name);
    RemoteInput remoteInput = new RemoteInput.Builder("heima")
            .setLabel(replyLabel)
            .build();
    //[3]创建一个Action对象 可以指定用户一个友好的输入提示,可以指定跳转意图,
    Intent deleteIntent = new Intent("");
    Notification.Action action =
            new Notification.Action.Builder(R.mipmap.ic_launcher,
                    "请输入内容", PendingIntent.getActivity(this, 10002, deleteIntent, 0))
                    .addRemoteInput(remoteInput)
                    .build();
    
    //[3]创建一个Notification对象
    Notification notification =
            new Notification.Builder(this)
                    .setSmallIcon(R.mipmap.ic_notification)
                    .setContentTitle("传智播客")
                    .setContentText("消息通知")
                    .addAction(action)
                    .build();
    
    //[4]发送这个notification 
    mNotificationManager.notify(1, notification);
    public class MainActivity extends Activity {
        private int i = 0;
        private NotificationManager mNotificationManager;
        private static final String GROUP_NAME = "com.heima.notification_type";
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }
    
        public void sendNotification(View v){
            //[1]获取一个NotificationManager
            mNotificationManager = (NotificationManager) getSystemService(
                    Context.NOTIFICATION_SERVICE);
            //[2]创建一个Notification
            //[2.1]需要给这个Notification对象指定icon,标题,内容,
            final Notification builder = new NotificationCompat.Builder(this)
                    .setSmallIcon(R.mipmap.ic_notification)
                    .setContentTitle(getString(R.string.app_name))
                    .setContentText("这是一个消息通知")
                    .setAutoCancel(true)
                    .setGroup(GROUP_NAME)
                    .build();
            //[3]发送一个通知 需要指定一个Notification对象和一个id,这个id必须是唯一的
            mNotificationManager.notify(i++, builder);
        }
    
        public void sendGroup(View v){
    
            //[1]获取一个NotificationManager
            mNotificationManager = (NotificationManager) getSystemService(
                    Context.NOTIFICATION_SERVICE);
            //[2]创建一个Notification
            //[2.1]需要给这个Notification对象指定icon,标题,内容,
                 final Notification builder = new NotificationCompat.Builder(this)
                    .setSmallIcon(R.mipmap.ic_notification)
                    .setContentTitle(getString(R.string.app_name))
                    .setContentText("这是一个消息通知")
                    .setAutoCancel(true)
                    .setGroup(GROUP_NAME)
                    .build();
            //[3]发送一个通知 需要指定一个Notification对象和一个id,这个id必须是唯一的
            mNotificationManager.notify(i++, builder);
    
    
            //[4]创建一个notification组
            String notificationContent = "传智播客" + i;
            final NotificationCompat.Builder builder1 = new NotificationCompat.Builder(this)
                    .setSmallIcon(R.mipmap.ic_notification)
                    .setStyle(new NotificationCompat.BigTextStyle()
                            .setSummaryText(notificationContent))
                    .setGroup(GROUP_NAME)
                    .setGroupSummary(true);
            final Notification notification = builder1.build();
            //[5]发送这个notification组
            mNotificationManager.notify(101, notification);
    
        }
    
        public void send(View v){
    
            //[1]获取一个NotificationManager
            mNotificationManager = (NotificationManager) getSystemService(
                    Context.NOTIFICATION_SERVICE);
            //[2]创建remoteInput对象,这个对象指定了这个notification的标题和一个key
            String replyLabel = getResources().getString(R.string.app_name);
            RemoteInput remoteInput = new RemoteInput.Builder("heima")
                    .setLabel(replyLabel)
                    .build();
            //[3]创建一个Action对象 可以指定用户一个友好的输入提示,可以指定跳转意图,
            Intent deleteIntent = new Intent(this,MainActivity.class);
            Notification.Action action =
                    new Notification.Action.Builder(R.mipmap.ic_launcher,
                            "请输入内容", PendingIntent.getActivity(this, 10002, deleteIntent, 0))
                            .addRemoteInput(remoteInput)
                            .build();
    
            //[3]创建一个Notification对象
            Notification notification =
                    new Notification.Builder(this)
                            .setSmallIcon(R.mipmap.ic_notification)
                            .setContentTitle("传智播客")
                            .setContentText("消息通知")
                            .addAction(action)
                            .build();
    
            //[4]发送这个notification
            mNotificationManager.notify(1, notification);
    
        }
    }

    http://android.xsoftlab.net/guide/topics/ui/notifiers/notifications.html#CustomNotification

    http://android.xsoftlab.net/design/patterns/notifications.html

    自定义Notification

    布局文件

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
    
        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="自定义的notification" />
    
        <ProgressBar
            android:id="@+id/progressBar1"
            android:max="100"
            android:progress="50"
            style="?android:attr/progressBarStyleHorizontal"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content" />
    
    </LinearLayout>

    实现代码

    public class DemoActivity extends Activity {
        / Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
        }
    
        public void click(View view){
            System.out.println("haha");
            //1.创建notification 的管理器
            NotificationManager manager = (NotificationManager) this.getSystemService(NOTIFICATION_SERVICE);
            //2 .创建notification的实例
            Notification notification = new Notification();
            notification.flags = Notification.FLAG_AUTO_CANCEL;
            notification.icon = R.drawable.ic_launcher;
            notification.tickerText="自定义notification";
            //notification.contentView;
            //远程的view  我们的view对象 是要显示在另外一个进程里面 另外一个程序里面 所以就需要一个remote  view
            RemoteViews rv = new RemoteViews(getPackageName(), R.layout.custom_notification);
            rv.setTextViewText(R.id.textView1, "textview 自定义notification");
            rv.setProgressBar(R.id.progressBar1, 100, 50, false);
    
            notification.contentView = rv;
            Intent intent = new Intent(this,DemoActivity.class);
            PendingIntent  pendingIntent = PendingIntent.getActivity(this, 0, intent, Intent.FLAG_ACTIVITY_NEW_TASK);
            notification.contentIntent = pendingIntent;
    
            manager.notify(2, notification);
    
        }
    }

    Android视频教程

    展开全文
  • Android notification

    2017-07-10 16:06:19
    Notification

    1.悬挂式Notification

    public void suspendingNotification(Context context, String title, String content) {
        Log.w(TAG, "show ui update notification");
        mContext = context;
    
        NotificationManager manager = (NotificationManager) mContext.getSystemService(NOTIFICATION_SERVICE);
        //NormalIntent
        Intent intent = mContext.getPackageManager().getLaunchIntentForPackage(mContext.getPackageName());
        //PendingIntent
        PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 0, intent, 0);
    
        Notification notification;
        Notification.Builder builder = new Notification.Builder(mContext)
                .setContentTitle(title)
                .setContentText(content)
                .setSmallIcon(R.drawable.icon)
                .setLargeIcon(BitmapFactory.decodeResource(mContext.getResources(), R.drawable.icon));
        //Suspending
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            Log.w(TAG, "show hanging notification");
            builder.setContentText(content)
                    .setFullScreenIntent(pendingIntent, true);
        }
        notification = builder.build();
        //NotificationIntent
        notification.contentIntent = pendingIntent;
        //ClearWhenClicked
        notification.flags = Notification.FLAG_AUTO_CANCEL;
        manager.notify(0, notification);
    }

    2. 普通Notification

    public void normalNotification(Context context, String title, String content) {
        mContext = context;
    
        NotificationManager manager = (NotificationManager) mContext.getSystemService(NOTIFICATION_SERVICE);
        //NormalIntent
        Intent intent = mContext.getPackageManager().getLaunchIntentForPackage(mContext.getPackageName());
        //PendingIntent
        PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 0, intent, 0);
    
        Notification notification = new Notification.Builder(mContext)
                .setContentTitle(title)
                .setContentText(content)
                .setSmallIcon(R.drawable.icon)
                .setLargeIcon(BitmapFactory.decodeResource(mContext.getResources(), R.drawable.icon)).build();
    
        notification.contentIntent = pendingIntent;
    
        manager.notify(0, notification);
    }

    3. 自定义布局Notification

    public void customNotification(Context context, String packageName, String title, String content) {
        mContext = context;
        Intent intent;
    
        NotificationManager manager = (NotificationManager) mContext.getSystemService(NOTIFICATION_SERVICE);
        RemoteViews remoteViews = new RemoteViews(packageName, R.layout.notification);
        remoteViews.setTextViewText(R.id.title, title);
        remoteViews.setTextViewText(R.id.content, content);
    
    
        intent = new Intent();
        intent.setClass(mContext, MainActivity.class);
        intent.putExtra("target", "ok");
        PendingIntent okIntent = PendingIntent.getActivity(mContext, R.id.sml, intent, PendingIntent.FLAG_UPDATE_CURRENT);
        remoteViews.setOnClickPendingIntent(R.id.sml, okIntent);
    
        intent = new Intent();
        intent.setClass(mContext, MainActivity.class);
        intent.putExtra("target", "cancel");
        PendingIntent cancelIntent = PendingIntent.getActivity(mContext, R.id.cancel, intent, PendingIntent.FLAG_UPDATE_CURRENT);
        remoteViews.setOnClickPendingIntent(R.id.cancel, cancelIntent);
    
    
        Notification notification = null;
        Notification.Builder builder = new Notification.Builder(mContext)
                .setSmallIcon(R.drawable.icon)
                .setPriority(Notification.PRIORITY_DEFAULT);
        builder.setContent(remoteViews);
    
        notification = builder.build();
        if (android.os.Build.VERSION.SDK_INT >= 16) {
            notification.bigContentView = remoteViews;
        }
    
    
        manager.notify(1, notification);
    }

    4. 展开/收缩Notification

    public void inboxNotification(Context context, String packageName, String title, String content) {
        mContext = context;
        Notification.Builder mBuilder =
                new Notification.Builder(mContext)
                        .setSmallIcon(R.drawable.icon)
                        .setContentTitle(title)
                        .setContentText(content);
    
        RemoteViews remoteViews = new RemoteViews(packageName, R.layout.activity_wide);
    
        Notification notification = null;
        notification = mBuilder.build();
        if (android.os.Build.VERSION.SDK_INT >= 16) {
            notification = mBuilder.build();
            notification.bigContentView = remoteViews;
        }
        remoteViews = new RemoteViews(packageName, R.layout.activity_slim);
        notification.contentView = remoteViews;
    
        NotificationManager mNotificationManager =
                (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
        // mId allows you to update the notification later on.
        mNotificationManager.notify(1, notification);
    }
    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 65,092
精华内容 26,036
关键字:

notification