很多垃圾的安卓应用可以时不时向设备的通知栏推送消息,非常的烦人,这是怎么做到的呢?用一个例子来说明这个问题。
如下图:
在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的情况下,还是用这条几乎所有版本安卓的“过时”方法吧!