本文實現一個功能:點擊一個按鈕,發送一個系統通知功能
添加一個Activity
activity_main.xml:
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".Main36Activity"> <Button android:id="@+id/button40" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="顯示通知" /> </android.support.constraint.ConstraintLayout>
MainActivity.java:
1 package com.example.chenrui.app1; 2 3 import android.app.Notification; 4 import android.app.NotificationChannel; 5 import android.app.NotificationManager; 6 import android.graphics.BitmapFactory; 7 import android.os.Build; 8 import android.support.v4.app.NotificationCompat; 9 import android.support.v7.app.AppCompatActivity; 10 import android.os.Bundle; 11 import android.view.View; 12 import android.widget.Button; 13 14 public class MainActivity extends AppCompatActivity { 15 16 @Override 17 protected void onCreate(Bundle savedInstanceState) { 18 super.onCreate(savedInstanceState); 19 setContentView(R.layout.activity_main); 20 21 Button button = findViewById(R.id.button1); 22 button.setOnClickListener(new View.OnClickListener() { 23 @Override 24 public void onClick(View v) { 25 NotificationManager manager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE); 26 27 String channelId = "app1"; 28 if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O) { 29 NotificationChannel channel = new NotificationChannel(channelId,"app1",NotificationManager.IMPORTANCE_DEFAULT); 30 manager.createNotificationChannel(channel); 31 } 32 33 Notification notification = new NotificationCompat.Builder(MainActivity.this,channelId) 34 .setContentTitle("通知標題") 35 .setContentText("通知正文") 36 .setWhen(System.currentTimeMillis()) 37 .setSmallIcon(R.mipmap.ic_launcher) 38 .setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher)) 39 .build(); 40 manager.notify(1,notification); 41 } 42 }); 43 } 44 }
注意第28-31行的代碼,Android8.0及以上版本,要發送通知,需要配置通知頻道,不然無法成功發送通知。
上面的通知,在點擊的時候,不會有任何反應,下面我們把代碼修改一下,允許在點擊的時候進入一個Activity活動,注意紅色字體為新增的代碼:
1 package com.example.chenrui.app1; 2 3 import android.app.Notification; 4 import android.app.NotificationChannel; 5 import android.app.NotificationManager; 6 import android.app.PendingIntent; 7 import android.content.Intent; 8 import android.graphics.BitmapFactory; 9 import android.os.Build; 10 import android.support.v4.app.NotificationCompat; 11 import android.support.v7.app.AppCompatActivity; 12 import android.os.Bundle; 13 import android.view.View; 14 import android.widget.Button; 15 16 public class MainActivity extends AppCompatActivity { 17 18 @Override 19 protected void onCreate(Bundle savedInstanceState) { 20 super.onCreate(savedInstanceState); 21 setContentView(R.layout.activity_main); 22 23 Button button = findViewById(R.id.button1); 24 button.setOnClickListener(new View.OnClickListener() { 25 @Override 26 public void onClick(View v) { 27 NotificationManager manager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE); 28 29 String channelId = "app1"; 30 if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O) { 31 NotificationChannel channel = new NotificationChannel(channelId,"app1",NotificationManager.IMPORTANCE_DEFAULT); 32 manager.createNotificationChannel(channel); 33 } 34 35 Intent intent = new Intent(MainActivity.this,Main2Activity.class); 36 PendingIntent pi = PendingIntent.getActivity(MainActivity.this,0,intent,0); 37 38 Notification notification = new NotificationCompat.Builder(Main2Activity.this,channelId) 39 .setContentTitle("通知標題") 40 .setContentText("通知正文") 41 .setWhen(System.currentTimeMillis()) 42 .setSmallIcon(R.mipmap.ic_launcher) 43 .setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher)) 44 .setContentIntent(pi) 45 .setAutoCancel(true) 46 .build(); 47 manager.notify(1,notification); 48 } 49 }); 50 } 51 }
PendingIntent可以理解為一種延時執行的Intent,當點擊通知項的時候進入到對應的Activity中。
更多屬性的使用:
.setDefaults(NotificationCompat.DEFAULT_ALL)
使用通知的默認效果,這個屬性會根據當前手機的環境決定播放什么鈴聲,以及如何震動等
.setPriority(NotificationCompat.PRIORITY_MAX)
設置通知的優先級,設置為NotificationCompat.PRIORITY_MAX是最高級,會以橫幅的方式顯示通知,部分手機可能禁用了橫幅通知,需要手工開啟
.setStyle(new NotificationCompat.BigTextStyle().bigText("通知內容"))
如果內容過多的話,默認會顯示成省略號,如果要顯示大文本信息,可以使用setStyle,用於顯示大文本