【问题标题】:Cancel dynamic notification in Android when the notification is selected选择通知时取消Android中的动态通知
【发布时间】:2010-08-23 21:42:31
【问题描述】:

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

  1. 用户可以接收多个通知,每个通知都有一个 int 类型的动态 ID。
  2. 选择通知后,它会加载一个显示相应消息(SMS)的活动。
  3. 应自动关闭所选的单个通知。

我关于如何处理这个问题的想法是使用 putExtra 将整数 ID 添加到 Intent,然后可以从它加载的 Activity 中的 Intent 访问它,然后关闭调用它的通知。

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

  1. 通知最终将 目前从服务生成 它们是在测试时产生的 用户按下按钮。
  2. 选择通知后, 被称为活动的消息, 然后试图解雇 通知。 (为了 可见性)

这是我的问题:

  1. 当第一个通知是 选择,是正确的。这 通知被驳回。
  2. 当每个连续的通知是 选中,第一个通知的 显示ID,什么都没有 被解雇了。
  3. 我是Java新手,比较习惯 脚本语言(例如 Perl、PHP 等):)

这是我的来源:

<?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 );
        }
    }

}

【问题讨论】:

    标签: android notifications android-intent


    【解决方案1】:

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

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

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

    my_notification.flags |= Notification.FLAG_AUTO_CANCEL;
    

    在创建Notification的时候把上面的代码放上去。

    【讨论】:

    • 谢谢,这正是我正在寻找的答案。如果不阅读整个 Android 开发者网站,Java 新手很难找到此类功能的功能文档……我们不知道要搜索什么。我熟悉作为一个过程的生命周期,但我假设每个新意图都会重新实例化 Activity。你知道他们怎么说“假设”:) 再次感谢。
    • 请注意,对于 Kotlin 和 Java,您现在可以使用 NotificationCompat.Builder(my_context, my_channel_id).setAutoCancel(true) 来做同样的事情。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多