zoukankan      html  css  js  c++  java
  • Android学习——通知基本用法

      

      通知的用法还是比较 灵活的,既可以在活动里创建,也可以在广播接收器里创建,当然还可以在下一章中我们即 将学习的服务里创建。相比于广播接收器和服务,在活动里创建通知的场景还是比较少的, 因为一般只有当程序进入到后台的时候我们才需要使用通知。

      不过,无论是在哪里创建通知,整体的步骤都是相同的,下面我们就来学习一下创建通 知的详细步骤。首先需要一个 NotificationManager 来对通知进行管理,可以调用 Context 的 getSystemService()方法获取到。getSystemService()方法接收一个字符串参数用于确定获取系 统 的 哪 个 服 务 , 这 里 我 们 传 入 Context.NOTIFICATION_SERVICE 即 可 。 因 此 , 获 取NotificationManager 的实例就可以写成:

    1  NotificationManager manager = (NotificationManager)
    2 
    3  getSystemService(Context.NOTIFICATION_SERVICE);

      接下来需要创建一个 Notification 对象,这个对象用于存储通知所需的各种信息,我们 可以使用它的有参构造函数来进行创建。Notification 的有参构造函数接收三个参数,第一个 参数用于指定通知的图标,比如项目的 res/drawable 目录下有一张 icon.png 图片,那么这里 就可以传入 R.drawable.icon。第二个参数用于指定通知的 ticker 内容,当通知刚被创建的时 候,它会在系统的状态栏一闪而过,属于一种瞬时的提示信息。第三个参数用于指定通知被 创建的时间,以毫秒为单位,当下拉系统状态栏时,这里指定的时间会显示在相应的通知上。 因此,创建一个 Notification 对象就可以写成:

    1  Notification notification = new Notification(R.drawable.icon, "This is ticker text", System.currentTimeMillis());

      创建好了 Notification 对象后,我们还需要对通知的布局进行设定,这里只需要调用 Notification 的 setLatestEventInfo()方法就可以给通知设置一个标准的布局。这个方法接收四 个参数,第一个参数是 Context,这个没什么好解释的。第二个参数用于指定通知的标题内 容,下拉系统状态栏就可以看到这部分内容。第三个参数用于指定通知的正文内容,同样下 拉系统状态栏就可以看到这部分内容。第四个参数我们暂时还用不到,可以先传入 null。因 此,对通知的布局进行设定就可以写成:

    1  notification.setLatestEventInfo(context, "This is content title", "This is content text", null);

      以上工作都完成之后,只需要调用 NotificationManager 的 notify()方法就可以让通知显示 出来了。notify()方法接收两个参数,第一个参数是 id,要保证为每个通知所指定的 id 都是 不同的。第二个参数则是 Notification 对象,这里直接将我们刚刚创建好的 Notification 对象 传入即可。因此,显示一个通知就可以写成:

    1  manager.notify(1, notification);

      到这里就已经把创建通知的每一个步骤都分析完了,下面就让我们通过一个具体的例子 来看一看通知到底是长什么样的。

      新建一个 NotificationTest 项目,并修改 activity_main.xml 中的代码,如下所示:

     1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"
     2 android:orientation="vertical" >
     3 <Button android:id="@+id/send_notice" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Send notice"
     4 
     5 />
     6 
     7 
     8 </LinearLayout>
     9 
    10 布局文件非常简单,里面只有一个 Send notice 按钮,用于发出一条通知。接下来修改
    11 
    12 MainActivity 中的代码,如下所示:
    13 
    14 
    15 public class MainActivity extends Activity implements OnClickListener {
    16 
    17 
    18 
    19 private Button sendNotice;
    20 
    21 
    22 @Override
    23 
    24 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
    25 
    26 sendNotice = (Button) findViewById(R.id.send_notice);
    27 
    28 sendNotice.setOnClickListener(this);
    29 
    30 }
    31 
    32 @Override
    33 
    34 public void onClick(View v) {
    35 
    36 switch (v.getId()) {
    37 
    38 case R.id.send_notice:
    39 
    40 NotificationManager manager = (NotificationManager)
    41 
    42 getSystemService(NOTIFICATION_SERVICE);
    43 
    44 Notification notification = new Notification(R.drawable. ic_launcher, "This is ticker text", System.currentTimeMillis());
    45 
    46 notification.setLatestEventInfo(this, "This is content title",
    47 
    48 "This is content text", null); manager.notify(1, notification); break;
    49 
    50 default:
    51 
    52 break;
    53 
    54 }
    55 
    56 }
    57 
    58 
    59 }

      可以看到,我们在 Send notice 按钮的点击事件里面完成了通知的创建工作,创建的过程 正如前面所描述的一样。现在就可以来运行一下程序了,点击 Send notice 按钮,就会看到有 一条通知在系统状态栏显示出来,

      如果你使用过 Android 手机,此时应该会下意识地认为这条通知是可以点击的。但是当 你去点击它的时候,你会发现没有任何效果。不对啊,好像每条通知点击之后都应该会有反 应的呀?其实要想实现通知的点击效果,我们还需要在代码中进行相应的设置,这就涉及到 了一个新的概念,PendingIntent。

      PendingIntent 从名字上看起来就和 Intent 有些类似,它们之间也确实存在着不少共同点。 比如它们都可以去指明某一个“意图”,都可以用于启动活动、启动服务以及发送广播等。 不同的是,Intent 更加倾向于去立即执行某个动作,而 PendingIntent 更加倾向于在某个合适 的时机去执行某个动作。所以,也可以把 PendingIntent 简单地理解为延迟执行的 Intent。

      PendingIntent 的用法同样很简单,它主要提供了几个静态方法用于获取 PendingIntent 的 实例,可以根据需求来选择是使用 getActivity()方法、getBroadcast()方法、还是 getService() 方法。这几个方法所接收的参数都是相同的,第一个参数依旧是 Context,不用多做解释。 第二个参数一般用不到,通常都是传入 0 即可。第三个参数是一个 Intent 对象,我们可以通 过这个对象构建出 PendingIntent 的“意图”。第四个参数用于确定 PendingIntent 的行为,有 FLAG_ONE_SHOT、FLAG_NO_CREATE、FLAG_CANCEL_CURRENT 和 FLAG_UPDATE_ CURRENT 这四种值可选,每种值的含义你可以查看文档,我就不一一进行解释了。

      对 PendingIntent 有 了 一 定 的 了 解 后 , 我 们 再 回 过 头 来 看 一 下 Notification 的 setLatestEventInfo()方法。刚才我们将 setLatestEventInfo()方法的第四个参数忽略掉了,直接 传入了 null,现在仔细观察一下,发现第四个参数正是一个 PendingIntent 对象。因此,这里 就可以通过 PendingIntent 构建出一个延迟执行的“意图”,当用户点击这条通知时就会执行 相应的逻辑。

      现在我们来优化一下 NotificationTest 项目,给刚才的通知加上点击功能,让用户点击它 的时候可以启动另一个活动。

      首先需要准备好另一个活动,这里新建布局文件 notification_layout.xml,代码如下所示:

     1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" >
     2 
     3  
     4 
     5 <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:textSize="24sp"
     6 
     7 android:text="This is notification layout"
     8 
     9 />
    10 
    11  
    12 
    13  
    14 
    15  
    16 
    17  
    18 
    19 </RelativeLayout>

      布局文件的内容非常简单,只有一个居中显示的 TextView,用于展示一段文本信息。然 后新建 NotificationActivity 继承自 Activity,在这里加载刚才定义的布局文件,代码如下所示:

     1 public class NotificationActivity extends Activity {
     2 
     3  
     4 
     5 @Override
     6 
     7 protected void onCreate(Bundle savedInstanceState) {
     8 
     9 super.onCreate(savedInstanceState);
    10 
    11 setContentView(R.layout.notification_layout);
    12 
    13 }
    14 
    15 }

      接着修改 AndroidManifest.xml 中的代码,在里面加入 NotificationActivity 的注册声明, 如下所示:

     1 <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.notificationtest"
     2 
     3 android:versionCode="1"
     4 
     5 android:versionName="1.0" >
     6 
     7 ……
     8 
     9 <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" >
    10 
    11 ……
    12 
    13 <activity android:name=".NotificationActivity" >
    14 
    15 </activity>
    16 
    17 </application>
    18 
    19  
    20 
    21  </manifest>

      这样就把 NotificationActivity 这个活动准备好了,下面我们修改 MainActivity 中的代码, 给通知加入点击功能,如下所示:

     1 public class MainActivity extends Activity implements OnClickListener {
     2 
     3 ……
     4 
     5 @Override
     6 
     7 public void onClick(View v) {
     8 
     9  
    10 
    11  
    12 
    13  
    14 
    15 switch (v.getId()) {
    16 
    17 case R.id.send_notice:
    18 
    19 NotificationManager manager = (NotificationManager)
    20 
    21 getSystemService(NOTIFICATION_SERVICE);
    22 
    23 Notification notification = new Notification(R.drawable. ic_launcher, "This is ticker text", System.currentTimeMillis());
    24 
    25 Intent intent = new Intent(this, NotificationActivity.class); PendingIntent pi = PendingIntent.getActivity(this, 0, intent,
    26 
    27 PendingIntent.FLAG_CANCEL_CURRENT);
    28 
    29 notification.setLatestEventInfo(this, "This is content title", "This is content text", pi);
    30 
    31 manager.notify(1, notification);
    32 
    33 break;
    34 
    35 default:
    36 
    37 break;
    38 
    39 }
    40 
    41 }
    42 
    43  
    44 
    45 }

      可以看到,这里先是使用 Intent 表达出我们想要启动 NotificationActivity 的“意图”,然 后将构建好的 Intent 对象传入到 PendingIntent 的 getActivity()方法里,以得到 PendingIntent 的实例,接着把它作为第四个参数传入到 Notification 的 setLatestEventInfo()方法中。

      现在重新运行一下程序,并点击 Send notice 按钮,依旧会发出一条通知。然后下拉系统 状态栏,点击一下该通知,就会看到 NotificationActivity 这个活动的界面了。

      如果我们没有在代码中对该 通知进行取消,它就会一直显示在系统的状态栏上显示。解决的方法也很简单,调用 NotificationManager 的 cancel()方法就可以取消通知了。修改 NotificationActivity 中的代码, 如下所示:

     1 public class NotificationActivity extends Activity {
     2 
     3  
     4 
     5  
     6 
     7 @Override
     8 
     9 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.notification_layout); NotificationManager manager = (NotificationManager)
    10 
    11 getSystemService(NOTIFICATION_SERVICE);
    12 
    13 manager.cancel(1);
    14 
    15 }
    16 
    17  
    18 
    19  
    20 
    21 }

      可以看到,这里我们在 cancel()方法中传入了 1,这个 1 是什么意思呢?还记得在创建通 知的时候给每条通知指定的 id 吗?当时我们给这条通知设置的 id 就是 1。因此,如果你想 要取消哪一条通知,就在 cancel()方法中传入该通知的 id 就行了。

  • 相关阅读:
    sqlserver 测试sql语句执行时间
    最大子数组问题(求连续子数组的最大和)
    字符、字节和编码
    Android 的数据存储——SharePreferences
    TCP、UDP原理及比较
    计算机常识——软件系统体系结构
    三个线程循环打印ABC10次的几种解决方法
    Analysis of Algorithms--preface
    Java native方法、JNI实例及常见错误分析
    随笔-2014-9-30
  • 原文地址:https://www.cnblogs.com/znjy/p/14908391.html
Copyright © 2011-2022 走看看