«

【Android】利用Notification操作设备的通知栏

时间:2024-3-2 19:09     作者:韩俊     分类: Android


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

如下图:


在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的情况下,还是用这条几乎所有版本安卓的“过时”方法吧!

标签: android

热门推荐