Android – Banner-Benachrichtigungen

Der Effekt der Bannerbenachrichtigung, auch Erinnerungsbenachrichtigung genannt, ist in der folgenden Abbildung dargestellt:
Fügen Sie hier eine Bildbeschreibung ein
Dieser Effekt muss in einigen Mainstream-Apps wie QQ, WeChat und DingTalk jedem bekannt sein. Heute werde ich darüber sprechen, wie man ihn erreicht.

Es gibt drei Bedingungen, die Erinnerungsbenachrichtigungen auslösen können:

  • Die Aktivität des Benutzers erfolgt im Vollbildmodus (Anwendung verwendet fullScreenIntent).
  • Benachrichtigungen haben eine hohe Priorität und verwenden Klingeltöne oder Vibration auf Geräten mit Android 7.1 (API-Level 25) und niedriger.
  • Auf Geräten mit Android 8.0 (API-Level 26) und höher hat der Benachrichtigungskanal Vorrang.

Die Realität sieht jedoch oft grausam aus: Wenn Sie die Anforderungen befolgen, stellen Sie fest, dass das System über 8.0 immer noch nicht den gewünschten Effekt erzielen kann. Lassen Sie uns im Folgenden kurz auf die Gründe eingehen.

Da die meisten Apps in China relativ bösartig sind, senden Sie, wenn Ihnen diese Benachrichtigung gefällt, auch die Benachrichtigung, was dazu führt, dass Benutzer mit einer Reihe von Spam-Nachrichten belästigt werden. Um Benutzer vor solchen Nachrichten zu schützen, schließt das System die Berechtigung . Wenn Sie anzeigen möchten, kann die Berechtigung nur manuell vom Benutzer geöffnet werden. Und das System hat keine Möglichkeit herauszufinden, ob die Berechtigung aktiviert ist. Wenn das Produkt daher QQ und andere nationale Anwendungen verwendet, um Ihnen mitzuteilen, was andere erreichen können, seien Sie bitte mutig und kehren Sie zurück. Diese Anwendungshersteller öffnen die Berechtigungen im Allgemeinen standardmäßig. Dazu gibt es nichts zu sagen, und die Ebene ist vorhanden.

Die Methode zum Öffnen der Berechtigungsverwaltungsseite unterscheidet sich in den verschiedenen Versionen etwas und muss angepasst werden:

//打开系统消息通知设置页面
Intent intent = new Intent();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    //android 8.0引导,引导到CHANNEL_ID对应的渠道设置下
    intent.setAction(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS);
    intent.putExtra(Settings.EXTRA_APP_PACKAGE, getContext().getPackageName());
    intent.putExtra(Settings.EXTRA_CHANNEL_ID, newChannel);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    //android 5.0-7.0,引导到所有渠道设置下(单个渠道没有具体的设置)
    intent.setAction(Settings.ACTION_APP_NOTIFICATION_SETTINGS);
    intent.putExtra("app_package", getContext().getPackageName());
    intent.putExtra("app_uid", getContext().getApplicationInfo().uid);
} else {
    //其他
    intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
    intent.setData(Uri.fromParts("package", getContext().getPackageName(), null));
}

startActivity(intent);

Das Obige ist eine Lösung, und einige Leute haben gesagt, dass der Benutzer meiner Meinung nach jederzeit eine Bannerbenachrichtigung anzeigen kann, also schreiben Sie sie selbst. Die allgemeine Idee besteht darin, einen Toast oder Dialog in einem schwebenden Fenster anzuzeigen.

Der ungefähre Code lautet wie folgt:

private static void showHeadsUpNotification(Context context, UMessage uMessage) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            //1、判断是否开启了悬浮通知栏权限   注:部分华为无效
            if (!Settings.canDrawOverlays(MyApplication.getInstance())) {
                MessageDialog.show((AppCompatActivity) ActivityUtils.getTopActivity(), "提示",
                        "请打开" + AppUtils.getAppName() + "的悬浮窗权限,否则会有很多重要消息漏掉哦!", "确定", "取消")
                        .setOnOkButtonClickListener(new OnDialogButtonClickListener() {
                            @Override
                            public boolean onClick(BaseDialog baseDialog, View v) {
                                //未显示消息入队
                                headsupMsgQueue.offer(uMessage);

                                requestOverlayPermission();
                                return false;
                            }
                        })
                        .setOnCancelButtonClickListener(new OnDialogButtonClickListener() {
                            @Override
                            public boolean onClick(BaseDialog baseDialog, View v) {
                                return false;
                            }
                        });

            } else {
                //显示横幅通知
                showHeadsUpNotification_(context, uMessage);
            }
        }
}

//请求悬浮窗权限
@TargetApi(Build.VERSION_CODES.M)
private static void requestOverlayPermission() {
        Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
        intent.setData(Uri.parse("package:" + AppUtils.getAppPackageName()));
        ActivityUtils.getTopActivity().startActivityForResult(intent, ALERT_WINDOW_PERMISSION_REQCODE);
}

public static void showHeadsUpNotification_(Context context) {
        if (headsupMsgQueue.isEmpty())
            return;

		//由于一开始没有悬浮窗权限,所以当收到消息通知时先将他们暂时都存入队列中,当获得权限之后再显示横幅通知
        while (!headsupMsgQueue.isEmpty()) {
            UMessage uMessage = headsupMsgQueue.poll();
            if (uMessage != null) {
                showHeadsUpNotification_(context, uMessage);
            }
        }
}

private static void showHeadsUpNotification_(Context context, UMessage uMessage) {
	new Handler(Looper.getMainLooper()).post(() -> {//这里要看是否在子线程中再加
            // 传入 Application 对象表示设置成全局的,但需要有悬浮窗权限
            new XToast<>(MyApplication.getInstance())
                    .setView(R.layout.layout_headsup_notification)
                    // 设置成可拖拽的
                    //.setDraggable()
                    // 设置显示时长
                    .setDuration(6000)
                    // 设置动画样式
                    //.setAnimStyle(android.R.style.Animation_Translucent)
                    // 设置外层是否能被触摸
                    //.setOutsideTouchable(false)
                    // 设置窗口背景阴影强度
//                .setBackgroundDimAmount(0.5f)
                    .setGravity(Gravity.TOP)
                    .setText(R.id.notification_app_name, AppUtils.getAppName())
                    .setText(R.id.notification_title, uMessage.title)
                    .setText(R.id.notification_text, uMessage.text)
                    .setOnClickListener(new XToast.OnClickListener<View>() {
                        @Override
                        public void onClick(XToast<?> toast, View view) {
                            // 点击这个 View 后消失
                            toast.cancel();

                            if (uMessage.extra != null && uMessage.extra.containsKey("type") && uMessage.extra.containsKey("content")) {
                                // 跳转到某个Activity
                                Intent handleIntent = new Intent(context, NotifyActivity.class);
                                toast.startActivity(handleIntent);
                            }
                        }
                    })
                    .show();
        });
  }

Der Code stellt nur Implementierungsideen bereit und kann nicht direkt ausgeführt werden. Schreiben Sie ihn bei Bedarf selbst entsprechend Ihren eigenen Anforderungen.

Das Aufzählungsfeld kann auf diese beiden Bibliotheken verweisen:
XPopup
XToast

Kürzlich habe ich diese Benachrichtigung gemacht. Leider ist die Autoritätskontrolle umso strenger, je höher die Version des System-Upgrades ist. Manchmal stellen wir fest, dass wir mit den vom System bereitgestellten Funktionen nichts anfangen können, also machen wir es selbst .

Supongo que te gusta

Origin blog.csdn.net/u012230055/article/details/118225327
Recomendado
Clasificación