很多垃圾的安卓应用可以时不时向设备的通知栏推送消息,非常的烦人,这是怎么做到的呢?用一个例子来说明这个问题。
如下图:
在MainActivity中有三个按钮,每次点击“显示通知”则向设备的通知栏推送一条消息。同时操作设备闪光灯与振动器。
“删除最近一条通知”按钮,可以删除本app最近向通知栏推送的一条通知(废话-_-!)
“删除所有通知”按钮,可以清除通知栏的所有推送,当然,现在一些安卓系统本身就有这个功能。
点击通知栏的通知,则显示一个Dialog类型的Activity,并且删除这条通知。
1、首先,设置好resvaluesstrings.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,同时在reslayout新建一个关于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、之后,修改reslayout中的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、然后,修改reslayoutactivity_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的情况下,还是用这条几乎所有版本安卓的“过时”方法吧!