选择通知时,在Android中取消动态通知

时间:2010-08-23 21:42:32

标签: android notifications android-intent

假设我正在创建一个类似于SMS应用程序的Android应用程序。要求如下:

  1. 用户可以接收多个通知,每个通知都具有int类型的动态ID。
  2. 选择通知后,它会加载显示相应消息(SMS)的活动。
  3. 应自动取消选中的单个通知。
  4. 我对如何处理这个问题的想法是使用putExtra将整数ID添加到intent中,然后可以从它加载的活动中的intent中访问它,然后它会关闭调用它的通知。

    对于我的测试用例,以下是规格:

    1. 最终会有通知 从现在开始,从服务生成 他们正在测试时产生 用户按下按钮。
    2. 选择通知时, 被称为活动的消息, 然后试图解雇 通知。 (为了 可见性)
    3. 以下是我的问题:

      1. 第一次通知时 选中,这是对的。该 通知被驳回。
      2. 每次连续通知时 选中,第一个通知 ID显示,没有 驳回。
      3. 我是Java新手,比较习惯 脚本语言(如 Perl,PHP等):))
      4. 这是我的来源:

        <?xml version="1.0" encoding="UTF-8"?>
        <LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
            android:orientation = "vertical"
            android:layout_width = "fill_parent"
            android:layout_height = "fill_parent"
        >
            <Button
                android:id="@+id/create_notification"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:padding="10dp"
                android:text = "Create new notification"
            />
        

        package org.test.notifydemo;
        
        import android.app.Activity;
        import android.app.Notification;
        import android.app.NotificationManager;
        import android.app.PendingIntent;
        import android.content.Context;
        import android.content.Intent;
        import android.os.Bundle;
        import android.view.View;
        import android.widget.Button;
        import android.widget.Toast;
        import java.util.Random;
        
        public class aRunNotificationDemo extends Activity
        {
            private NotificationManager mNotificationManager;
        
            @Override
            public void onCreate( Bundle icicle )
            {
                super.onCreate( icicle );
                setContentView( R.layout.run_notify_demo );
        
                mNotificationManager = (NotificationManager) getSystemService( aRunNotificationDemo.NOTIFICATION_SERVICE );
        
                int close_notify_id = getIntent().getIntExtra( "notification_id", 0 );
                if ( close_notify_id != 0 )
                {
                    Toast.makeText( aRunNotificationDemo.this, "Dimissing this notification: " + Integer.toString(close_notify_id), Toast.LENGTH_SHORT ).show();
                    mNotificationManager.cancel( close_notify_id );
                }
        
                findViewById( R.id.create_notification ).setOnClickListener( new MyButtonListener() );
            }
        
            private class MyButtonListener implements Button.OnClickListener
            {
                public void onClick( View my_view )
                {
                    Random randGen = new Random();
                    int notify_id = randGen.nextInt();
        
                    int icon = R.drawable.icon_notification_01;
                    CharSequence tickerText = Integer.toString(notify_id) + " New SMS!";
                    long when = System.currentTimeMillis();
        
                    Notification my_notification = new Notification(icon, tickerText, when);
        
                    Context context = getApplicationContext();
                    CharSequence contentTitle = Integer.toString(notify_id) + " New SMS Available!";
                    CharSequence contentText = Integer.toString(notify_id) + " There is a new SMS available.";
                    Intent notificationIntent = new Intent( aRunNotificationDemo.this, aRunNotificationDemo.class );
        
                    notificationIntent.putExtra( "notification_id", notify_id );
        
                    PendingIntent contentIntent = PendingIntent.getActivity( aRunNotificationDemo.this, 0, notificationIntent, 0 );
        
                    my_notification.setLatestEventInfo( context, contentTitle, contentText, contentIntent );
        
                    mNotificationManager.notify( notify_id, my_notification );
                }
            }
        
        }
        

1 个答案:

答案 0 :(得分:16)

一旦创建活动,就会调用其onCreate()方法。下次显示时,不一定要调用该方法。尝试将删除通知的代码移动到onResume()方法。熟悉活动生命周期。

顺便说一句,它比你想象的容易:

http://developer.android.com/reference/android/app/Notification.html#FLAG_AUTO_CANCEL

my_notification.flags |= Notification.FLAG_AUTO_CANCEL;

创建Notification时将代码放在上面。