Android8.0 通知欄不顯示、無橫幅通知問題解決

不知不覺安卓都快9.0了(更新的可夠快的),隨着它的更新會出現許多新的問題和新的知識,所以我們要不停地學習以及“更新自己”

追加2019-07-18 無橫幅通知解決:最近發現大家反饋直接使用代碼只能實現圖二效果。然後樓主查閱了很多資料,然而都無法很好解決問題。之後研究了一番(諾基亞、華爲、小米)小米和華爲不能彈出,猜測原因可能是系統版本過高或廠家自定義了系統。因爲IM接入時,消息通知問題也接入小米和華爲的專用sdk。廢話不多說,直接上解決辦法,下滑到 步驟3

8.0通知欄效果圖如下:

  

1、先說明爲什麼NotificationCompat.Builder()過時問題,在安卓8.0 “O” 對通知欄新增了一個ChannelId參數,在new的時候添加上channelId即可

new NotificationCompat.Builder(this,"default")

2、爲什麼以前通知欄代碼在8.0無法顯示,8.0應該怎樣修改才能顯示通知信息,下面爲大家解答

步驟:

1、每次進行通知觸發時,對系統版本進行判斷,8.0及以上需要設置好“channelId”(沒有特殊要求、唯一即可)、“channelName”(用戶看得到的信息)、“importance”(重要等級)這三個重要參數,然後創建到NotificationManager

2、常規方式觸發即可、區別在於NotificationCompat.Builder()時加上前面設置的“channelId”

代碼如下:

public class MainActivity extends AppCompatActivity{

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		Button button = (Button) findViewById(R.id.button);

		button.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				notification();
				finish();
			}
		});
	}

	private void notification() {
		Intent intent = new Intent(this, NotificationIntent.class);
		NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
         //8.0 以後需要加上channelId 才能正常顯示
		if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
			String channelId = "default";
			String channelName = "默認通知";
			manager.createNotificationChannel(new NotificationChannel(channelId, channelName, NotificationManager.IMPORTANCE_HIGH));
		}

		//設置TaskStackBuilder
		TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
		stackBuilder.addParentStack(NotificationIntent.class);
		stackBuilder.addNextIntent(intent);

		PendingIntent pendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);

		Notification notification = new NotificationCompat.Builder(this, "default")
				.setSmallIcon(R.mipmap.ic_launcher)
				.setContentTitle("標題")
				.setContentText("這是內容,點擊我可以跳轉")
				.setAutoCancel(true)
				.setDefaults(Notification.DEFAULT_ALL)
				.setWhen(System.currentTimeMillis())
				.setContentIntent(pendingIntent)
				.build();

		manager.notify(1, notification);
	}

 TaskStackBuilder 作用是打開跳轉頁面點擊返回時回到指定頁面,可以參考我之前的博客 Notification通知欄設置及其點擊響應

    <activity android:name=".NotificationIntent"
            android:parentActivityName=".MainActivity"/>

Kotlin代碼如下

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        button.setOnClickListener{
            notification()
            finish()
        }
    }

    fun notification() {
        val intent = Intent(this,NotificationIntent::class.java)
        val manager: NotificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
        //8.0 以後需要加上channelId 才能正常顯示
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
            val channelId = "default"
            val channelName = "默認通知"
            manager.createNotificationChannel(NotificationChannel(channelId, channelName, NotificationManager.IMPORTANCE_HIGH))
        }

        val stackBuilder = TaskStackBuilder.create(this)
        stackBuilder.addParentStack(NotificationIntent::class.java)
        stackBuilder.addNextIntent(intent)

        val pendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT)

        val notification = NotificationCompat.Builder(this,"default")
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentTitle("標題")
                .setContentText("這是內容,點擊我可以跳轉")
                .setAutoCancel(true)
                .setDefaults(Notification.DEFAULT_ALL)
                .setWhen(System.currentTimeMillis())
                .setContentIntent(pendingIntent)
                .build()

        manager.notify(1,notification)
    }

 3、安卓6.0及以上部分手機消息無橫幅通知

關鍵點在,開啓懸浮窗權限

  <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

 

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            //判斷是否開啓了懸浮通知欄權限   注:部分華爲無效
            if (!Settings.canDrawOverlays(this)) {
                getOverlayPermission();
            }
        }

 //請求懸浮窗權限
    @TargetApi(Build.VERSION_CODES.M)
    private void getOverlayPermission() {
        Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
        intent.setData(Uri.parse("package:" + getPackageName()));
        startActivityForResult(intent, 0);
    }


    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        //....自行做回調處理
    }

 加入以上代碼解決了小米沒有彈窗問題,但是華爲還是不行,技術淺薄,還在研究中。。。

贈人玫瑰,手有餘香。如果對你有幫助,請大方給個贊!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章