通知栏发送消息Notification(可以使用自定义的布局)

一个简单的应用场景:假如用户打开Activity以后,按Home键,此时Activity 进入-> onPause() -> onStop() 不可见。代码在此时机发送一个Notification到通知栏。当用户点击通知栏的Notification后,又重新onRestart() -> onStart() -> onResume() 切换回原Activity。

  1 package com.zzw.testnotification;
  2
  3 import android.app.Activity;
  4 import android.app.Notification;
  5 import android.app.NotificationManager;
  6 import android.app.PendingIntent;
  7 import android.content.Context;
  8 import android.content.Intent;
  9 import android.os.Bundle;
 10 import android.support.v4.app.NotificationCompat.Builder;
 11 import android.util.Log;
 12 import android.widget.RemoteViews;
 13
 14 public class MainActivity extends Activity {
 15
 16     private static final String TAG = "---->";
 17
 18     private final int NOTIFICATION_ID = 0xa01;
 19     private final int REQUEST_CODE = 0xb01;
 20
 21     @Override
 22     protected void onCreate(Bundle savedInstanceState) {
 23         super.onCreate(savedInstanceState);
 24         setContentView(R.layout.activity_main);
 25         Log.d(TAG, "onCreate");
 26     }
 27
 28     @Override
 29     protected void onResume() {
 30         Log.d(TAG, "onResume");
 31         super.onResume();
 32     }
 33
 34     @Override
 35     protected void onDestroy() {
 36         Log.d(TAG, "onDestroy");
 37         super.onDestroy();
 38     }
 39
 40     @Override
 41     protected void onPause() {
 42         Log.d(TAG, "onPause");
 43         super.onPause();
 44     }
 45
 46     @Override
 47     protected void onRestart() {
 48         Log.d(TAG, "onRestart");
 49         super.onRestart();
 50     }
 51
 52     @Override
 53     protected void onStart() {
 54         Log.d(TAG, "onStart");
 55         super.onStart();
 56     }
 57
 58     @Override
 59     protected void onStop() {
 60         super.onStop();
 61         Log.d(TAG, "onStop");
 62         sendNotification(this, NOTIFICATION_ID, "这是标题", "这是内容");
 63     }
 64
 65
 66     //可当作发送通知栏消息模版使用
 67     private void sendNotification(Context context, int notification_ID, String title, String content) {
 68         NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
 69
 70         //使用默认的通知栏布局
 71         Builder builder = new Builder(context);
 72         // 此处设置的图标仅用于显示新提醒时候出现在设备的通知栏
 73         builder.setSmallIcon(R.drawable.ic_launcher);
 74         builder.setContentTitle(title);
 75         builder.setContentText(content);
 76
 77         Notification notification = builder.build();
 78
 79         /*    使用自定义的通知栏布局
 80          *  当用户下来通知栏时候看到的就是RemoteViews中自定义的Notification布局
 81          */
 82         // RemoteViews contentView = new RemoteViews(context.getPackageName(),
 83         // R.layout.notification);
 84         // contentView.setImageViewResource(R.id.imageView, R.drawable.ic_launcher);
 85         // contentView.setTextViewText(R.id.title, "土耳其和IS的秘密");
 86         // contentView.setTextViewText(R.id.text, "土耳其拒绝向俄罗斯道歉,怀疑有IS撑腰");
 87         // notification.contentView = contentView;
 88
 89         // 发送通知到通知栏时:提示声音 + 手机震动 + 点亮Android手机呼吸灯。
 90         // 注意!!(提示声音 + 手机震动)这两项基本上Android手机均支持。
 91         // 但Android呼吸灯能否点亮则取决于各个手机硬件制造商自家的设置。
 92         notification.defaults = Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE | Notification.DEFAULT_LIGHTS;
 93
 94         // 点击notification自动消失
 95         notification.flags = Notification.FLAG_AUTO_CANCEL;
 96
 97         // 通知的时间
 98         notification.when = System.currentTimeMillis();
 99
100         // 需要注意的是,作为选项,此处可以设置MainActivity的启动模式为singleTop,避免重复新建onCreate()。
101         Intent intent = new Intent(context, MainActivity.class);
102
103         // 当用户点击通知栏的Notification时候,切换回MainActivity。
104         PendingIntent pi = PendingIntent.getActivity(context, REQUEST_CODE, intent, PendingIntent.FLAG_CANCEL_CURRENT);
105         notification.contentIntent = pi;
106
107         // 发送到手机的通知栏
108         notificationManager.notify(notification_ID, notification);
109     }
110
111     //可当作清除通知栏消息模版使用
112     private void deleteNotification(int id) {
113         NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
114         notificationManager.cancel(id);
115     }
116 }

需要注意的是,默认Android的Activity为标准模式,即每次都new一个新的Activity出来,不是原先的Activity,在本例中,可以观察到MainActivity中的onCreate()如果不修改启动模式,则每次本调用每次TextView显示的时间不同(递增),所有为了使用原来的Activity、避免重复new一个新的出来,需要:

在AndroidManifest.xml中修改MainActivity启动模式为:singleTop

<activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:launchMode="singleTop" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

notification.xml文件源代码:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent" >
 5
 6     <ImageView
 7         android:id="@+id/imageView"
 8         android:layout_width="50dp"
 9         android:layout_height="50dp"
10         android:layout_alignParentLeft="true"
11         android:layout_centerVertical="true"
12         android:src="@drawable/ic_launcher" />
13
14     <TextView
15         android:id="@+id/title"
16         android:layout_width="wrap_content"
17         android:layout_height="wrap_content"
18         android:layout_above="@+id/text"
19         android:layout_alignParentRight="true"
20         android:layout_alignTop="@+id/imageView"
21         android:layout_marginLeft="18dp"
22         android:layout_toRightOf="@+id/imageView"
23         android:gravity="center_vertical"
24         android:singleLine="true"
25         android:text="TextView" />
26
27     <TextView
28         android:id="@+id/text"
29         android:layout_width="wrap_content"
30         android:layout_height="wrap_content"
31         android:layout_alignBottom="@+id/imageView"
32         android:layout_alignLeft="@+id/title"
33         android:gravity="center_vertical"
34         android:singleLine="true"
35         android:text="TextView" />
36
37
38 </RelativeLayout>

notification.xml

由于sdk版本的不同,有的需要添加震动的权限:

<uses-permission android:name="android.permission.VIBRATE"/>
时间: 2024-12-17 13:38:51

通知栏发送消息Notification(可以使用自定义的布局)的相关文章

Android自定义通知布局Notification,点击Notification导航切换回原Activity

一个简单的应用场景:假如用户打开Activity以后,按Home键,此时Activity 进入-> onPause() -> onStop() 不可见.代码在此时机发送一个Notification到通知栏.当用户点击通知栏的Notification后,又重新onRestart() -> onStart() -> onResume() 切换回原Activity. package zhangphil.pendingintent; import android.os.Bundle; im

Notification(Notification的通知栏常驻、Notification的各种样式、Notification点击无效)

转自:http://blog.csdn.net/xy_nyle/article/details/19853591 Android的Notification是android系统中很重要的一个机制, 产品人员常常利用通知栏的方式,跟用户进行弱沟通.拥有推送通知的app要比没有此类功能的app活跃率要高很多.另外类似于墨迹天气,清理大师等 app,也会将通知栏常驻,利用自定义的布局,方便用户及时快捷的查看所需的信息和使用快捷的功能.所以Notification的使用,也在开发当中, 使用的越来越频繁.

【极光推送】给指定用户发送消息

前言 如果你还没有搭建极光推送服务器,建议你根据情况,先从服务器搭建开始. 前文标题: <[极光推送]jpush服务端开发详尽过程> 链接: http://ningmengjiabing.blog.163.com/blog/static/20484719820163194218972/ 如果你已经完成推送服务器的搭建,最后在验证推送功能时,返回的options大致格式应该如下所示: {"sendno":1525934458,"apns_production&quo

实现友盟推送消息的完全自定义处理

1,下面的前提是必须申请了友盟且有app key 2,集成友盟SDK  参看官方文档http://dev.umeng.com/push/android/integration#1 3,若开发者需要实现对消息的完全自定义处理,则可以继承 UmengBaseIntentService, 实现自己的Service来完全控制达到消息的处理.     1,实现一个类,继承 UmengBaseIntentService, 重写onMessage(Context context, Intent intent)

微信公众号开发之自动消息回复和自定义菜单

(一)微信公众号开发之VS远程调试 (二)微信公众号开发之基础梳理 (三)微信公众号开发之自动消息回复和自定义菜单 前言 上一篇我们大致讲解了下微信公众号开发的基本原理和流程概述.本章主要是对文本消息回复和自定义菜单做一个记录和分解 消息回复 处理请求,并响应 1)关注 也可参考官网文档:https://mp.weixin.qq.com/wiki 当微信用户关注公众账号时,可以给其适当的提示.可以是欢迎词,可以是帮助提示.示例代码如下: class EventHandler : IHandler

如何给对话框中的控件发送消息呢?Windows消息分类

以博文CTabCtrl中介绍的那样,给Tab添加子对话框来显示Tab内容.那么如果这个子对话框中含有个CTreeCtrl控件,有个Button控件,我想要模拟给这两个控件发送消息,该怎么办呢?直接把给控件的消息给控件容器(控件的父窗口)是没有用的.为什么呢?首先要明白windows的消息分类: Windows消息的分类 1. 标准消息(队列消息)除WM_COMMAND之外,所有以WM_开头的消息都是标准消息,如WM_MOUSEMOVE.WM_LBUTTONUP.WM_KEYDOWN.WM_C

Broadcast使用以及在通知栏显示消息

本实例只有1个界面(Activity),界面上包涵一个EditText及一个按钮.当按钮被按下时,获取EditText中的内容并广播.本实例还创建了一个BroadcastReceiver,用于接收按钮按下时的广播,并将广播消息内容显示于通知栏.当点击通知栏的广播消息时另一个Activity将会被打开.完成后显示效果如下:    编程实现 1.新建一个android项目(过程省略),添加需要的文件.添加后,此项目工程目录如下: 2.编辑activity_main.xml,添加一个EditText和

窗口发送消息参数详解

//    窗口.发送消息    函数功能: 将指定的消息发送到一个窗口,同win32 api 里面的SendMessage等同的效果 中文函数原型: 发送消息(hwnd,msg,wparam,iparam)      英文函数原型: sendmessage(hwnd,msg,wparam,iparam) 参数: hwnd: 窗口句柄 值,可以通过,找到窗口.顶层窗口句柄,等获取句柄的函数得到msg:指定被发送的消息wparam:指定附加的消息特定信息. iparam:指定附加的消息特定信息.举

android怎么得到通知栏的消息内容,然后保存消息

============问题描述============ android怎么得到通知栏的消息内容,然后保存消息,也就是来了一条消息,点击进去之后显示的界面怎么知道点击的通知的ID和内容还有时间信息. ============解决方案1============ 这个,真做不了. 通知管理器只能发送通知.不能取得通知. android系统也是为了安全性考虑 要是你可以取得别的程序的通知和通知里面的东西. 那岂不是就可以更改里面的内容,并且可以修改将要跳转的地方. 那样我就可以点击qq动听的通知,跳到