不知不覺安卓都快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) {
//....自行做回調處理
}
加入以上代碼解決了小米沒有彈窗問題,但是華爲還是不行,技術淺薄,還在研究中。。。
贈人玫瑰,手有餘香。如果對你有幫助,請大方給個贊!