1

嗨,Android 程序员们!

我目前正在编写一个应用程序,该应用程序使用新的 Android 4.3 通知侦听器在收到通知时更改通知 LED 的颜色,并且面临一个问题,可能是由于我对通知的工作原理缺乏了解。

到目前为止,它运行良好。当用户关闭屏幕时,我会创建一个带有自定义 LED 颜色的通知,并在屏幕打开时将其删除。我的问题是,当用户重新打开屏幕时,他可以在状态栏上看到我的通知图标半秒钟,然后才将其删除。没什么大不了的,但作为一个挑剔的人,我忍不住想办法避免这种丑陋的行为。我知道有些应用程序成功地做到了这一点——例如 LightFlow。

我的第一个想法是使用通知的优先级并使用 Notification.PRIORITY_MIN 几乎可以工作:通知图标不会显示在状态栏上,但会在状态栏展开时出现。

不幸的是,我发现当屏幕关闭时,具有最低优先级的通知不会切换 LED 的通知!

然后我尝试创建一个没有图标的通知,但框架不支持它 - 这实际上是一件好事。

现在我不知道了。

有人可以帮我找到一种方法来创建一个没有出现在状态栏上但仍然打开 LED 的通知吗?

或者也许我应该在屏幕实际打开之前删除我的通知,但我也找不到这样做的方法......

如果有人可以帮助我解决这个问题,那会让我很开心!

这是我的应用程序的代码源:

主要活动 :

package com.nightlycommit.coloration;

import android.app.Activity;
import android.os.Bundle;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
}

服务监听器

package com.nightlycommit.coloration;

import android.content.BroadcastReceiver;
import android.content.Intent;
import android.content.IntentFilter;
import android.service.notification.StatusBarNotification;

/**
 * Created by Eric on 08/08/13.
 */
public class NotificationListenerService extends android.service.notification.NotificationListenerService {
    private final String TAG = getClass().getSimpleName();

    @Override
    public void onCreate() {
        super.onCreate();

        // REGISTER RECEIVER THAT HANDLES SCREEN ON AND SCREEN OFF LOGIC
        IntentFilter filter = new IntentFilter();
        filter.addAction(Intent.ACTION_SCREEN_ON);
        filter.addAction(Intent.ACTION_SCREEN_OFF);

        BroadcastReceiver mReceiver = new ScreenStateReceiver();
        registerReceiver(mReceiver, filter);
    }

    @Override
    public void onNotificationPosted(StatusBarNotification sbn) {
        String text = "Notification posted !";
    }

    @Override
    public void onNotificationRemoved(StatusBarNotification sbn) {
        String text = "Notification removed !";
    }
}

屏幕状态接收器:

package com.nightlycommit.coloration;

import android.app.Notification;
import android.app.NotificationManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;

/**
 * Created by Eric on 12/08/13.
 */
public class ScreenStateReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        NotificationManager notificationManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
        String action = intent.getAction();

        if (action != null) {
            if (action.equals(Intent.ACTION_SCREEN_OFF)) {
                Notification.Builder builder = new Notification.Builder(context);

                builder.setLights(Color.argb(255,255,0,0), 500, 500);
                builder.setContentText("TEST");
                builder.setSmallIcon(R.drawable.ic_launcher);
                builder.setOngoing(true);
//                builder.setPriority(Notification.PRIORITY_MIN);

                notificationManager.notify(777, builder.build());
            } else if (action.equals(Intent.ACTION_SCREEN_ON)) {
                notificationManager.cancel(777);
            }
        }
    }
}

预先感谢,

埃里克。

4

0 回答 0