当前位置: 代码迷 >> Android >> 【Android】利用Notification操作装置的通知栏
  详细解决方案

【Android】利用Notification操作装置的通知栏

热度:68   发布时间:2016-04-28 00:20:48.0
【Android】利用Notification操作设备的通知栏

很多垃圾的安卓应用可以时不时向设备的通知栏推送消息,非常的烦人,这是怎么做到的呢?用一个例子来说明这个问题。

如下图:


在MainActivity中有三个按钮,每次点击“显示通知”则向设备的通知栏推送一条消息。同时操作设备闪光灯与振动器。

“删除最近一条通知”按钮,可以删除本app最近向通知栏推送的一条通知(废话-_-!)

“删除所有通知”按钮,可以清除通知栏的所有推送,当然,现在一些安卓系统本身就有这个功能。

点击通知栏的通知,则显示一个Dialog类型的Activity,并且删除这条通知。

1、首先,设置好res\values\strings.xml中的整个app的各个字体,当然你也可以边开放边设置,修改此文件的代码如下所示:

<?xml version="1.0" encoding="utf-8"?><resources>    <string name="app_name">通知</string>    <string name="action_settings">Settings</string>    <string name="button1">显示通知</string>    <string name="button2">删除最近一条通知</string>    <string name="button3">删除所有通知</string>    <string name="activity1_name">通知标题</string>    <string name="activity1_textview1">我是一条通知,欢迎</string>    <string name="activity1_button1">关闭</string></resources>
2、从这个文件大家已经可以看到,点击通知,将会进入一个新的Activity1,里面就有一个标签文本,与“关闭”按钮。因此,我们先在工程的src文件夹中新建一个继承android.app.Activity类的Activity1.java,同时在res\layout新建一个关于Activity1的布局文件activity1.xml。修改根目录的AndroidManifest.xml如下,注册这个Activity1.java,同时要求系统赋予这个应用操作设备闪光灯与振动器的权限。一会儿,推通知的时候打开设备闪光灯,与振动设备。

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.notification"    android:versionCode="1"    android:versionName="1.0" >    <uses-sdk        android:minSdkVersion="8"        android:targetSdkVersion="18" />    <!-- 需要操作闪光灯 -->    <uses-permission android:name="android.permission.FLASHLIGHT" />    <!-- 需要操作震动器 -->    <uses-permission android:name="android.permission.VIBRATE" />    <application        android:allowBackup="true"        android:icon="@drawable/ic_launcher"        android:label="@string/app_name"        android:theme="@style/AppTheme" >        <activity            android:name="com.notification.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>        <!-- 注册Activity1 -->        <activity            android:name="com.notification.Activity1"            android:label="@string/activity1_name"            android:theme="@android:style/Theme.Dialog" >        </activity>    </application></manifest>
3、之后,修改res\layout中的Activity1的布局文件activity1.xml如下,自上而下的线性布局,摆一个标签文本、一个关闭按钮没什么好说的。给这个Button赋予id,一会儿要在Activity1.java注册事件。

<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:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="@string/activity1_textview1"        android:textSize="24sp" />    <Button        android:id="@+id/activity1_button1"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="@string/activity1_button1"        android:textSize="24sp" /></LinearLayout>
4、其次,修改Activity1.java如下,为这个按钮注册点击事件,仅仅是关闭这个Activity1.java,没什么好说的。
package com.notification;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class Activity1 extends Activity {	private Button button1;	protected void onCreate(Bundle savedInstanceState) {		super.onCreate(savedInstanceState);		setContentView(R.layout.activity1);// 此Activity的布局文件为activity1.xml		button1 = (Button) findViewById(R.id.activity1_button1); // 获取button1		button1.setOnClickListener(new OnClickListener() {// 为button1添加点击事件			@Override			public void onClick(View v) {				finish();// 关闭此Activity			}		});	}}
5、然后,修改res\layout\activity_main.xml,在MainActivity中使用自上而下的线性布局,摆三个按钮,也没有什么好说的。分别赋予不同的id。一会操作它们。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical" >    <Button        android:id="@+id/button1"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="@string/button1"        android:textSize="24sp" />    <Button        android:id="@+id/button2"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="@string/button2"        android:textSize="24sp" />            <Button        android:id="@+id/button3"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="@string/button3"        android:textSize="24sp" /></LinearLayout>
6、最后才是我们的重头戏,修改MainActivity.java的代码如下,三个按钮的点击皆为操作通知:

package com.notification;import android.os.Bundle;import android.app.Activity;import android.app.Notification;import android.app.NotificationManager;import android.app.PendingIntent;import android.content.Intent;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class MainActivity extends Activity {	private Button button1;	private Button button2;	private Button button3;	private int notificationCounter;// 一个用于计算通知多少的计数器。	@Override	protected void onCreate(Bundle savedInstanceState) {		super.onCreate(savedInstanceState);		setContentView(R.layout.activity_main);		notificationCounter = 0;// 初始化计算通知多少的计数器,初始为0个信息。		final NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);// 注册通知管理器		// 注册各个组件,没什么好说的。		button1 = (Button) findViewById(R.id.button1);		button2 = (Button) findViewById(R.id.button2);		button3 = (Button) findViewById(R.id.button3);		// 显示通知按钮		button1.setOnClickListener(new OnClickListener() {			@SuppressWarnings("deprecation")			@Override			public void onClick(View arg0) {				notificationCounter++;// 计数器+1				Notification notification = new Notification();				notification.icon = R.drawable.ic_launcher;// 设置通知图标为app的图标				notification.flags = Notification.FLAG_AUTO_CANCEL;// 点击通知打开引用程序之后通知自动消失				notification.tickerText = "显示通知";// 在用户没有拉开标题栏之前,在标题栏中显示的文字				notification.when = System.currentTimeMillis();// 设置发送时间				notification.defaults = Notification.DEFAULT_ALL;// 设置使用默认声音、震动、闪光灯				// 以下三行为:在MainActivity中,如果点击信息则,打开Activity1				Intent intent = new Intent(MainActivity.this, Activity1.class);				PendingIntent pendingIntent = PendingIntent.getActivity(						MainActivity.this, 0, intent, 0);				notification.setLatestEventInfo(MainActivity.this, "消息标题",						"消息内容", pendingIntent);				notificationManager.notify(notificationCounter, notification);// 要求通知管理器发送这条通知,其中第一个参数是通知在系统的id			}		});		// 删除最近一条发出的通知		button2.setOnClickListener(new OnClickListener() {			@Override			public void onClick(View arg0) {				notificationManager.cancel(notificationCounter);// 实质是删除id为notificationCounter的通知				notificationCounter--;			}		});		// 清空通知栏的所有通知,一般app是不会这么良心的-_-!		button3.setOnClickListener(new OnClickListener() {			@Override			public void onClick(View arg0) {				notificationManager.cancelAll();			}		});	}}

注意,在MainActivity.java中注册通知管理器,必须以这种final类、终态类的方式所注册:final NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);否则app是无法启动的。

这里notification.setLatestEventInfo,设置通知标题与内容会被eclipse标志过时,但新的方法,使用builder去设置通知的方法只能应用于android3.0以上的设备,对于android2.2的设备是无法使用的。在现时国内有部分设备还是在android2.2的情况下,还是用这条几乎所有版本安卓的“过时”方法吧!

  相关解决方案