今天照着《Android第一行代码第二版-郭霖》把通知那部分的代码实现了一下,结果发现 Notification notification = new NotificationCompat.Builder(this)过时了。
我查了一下开发者文档,根据文档可以看到public Builder (Context context)已经过时了,需要在原来的基础上加上一个参数String类型的channelId。对于这个channelId,文档里并没有说明这个的具体含义,只是说通知将发布在此NotificationChannel???
不管了先随便设一个值看看效果,代码如下,布局文件的代码就不贴出来了,就一个按钮。
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.NotificationCompat;import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.graphics.BitmapFactory;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;public class MainActivity extends AppCompatActivity implements View.OnClickListener {NotificationManager manager ;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button sendNotice = findViewById(R.id.send_notice);sendNotice.setOnClickListener(this);manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);}@Overridepublic void onClick(View view) {switch (view.getId()){case R.id.send_notice:Notification notification = new NotificationCompat.Builder(this,"myChannelId").setContentTitle("This is content title").setContentText("This is content text").setWhen(System.currentTimeMillis()).setSmallIcon(R.mipmap.ic_launcher).setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher)).build();manager.notify(1,notification);break;default:break;}}
}
运行结果如下:
根据查看别的博客才知道要为通知注册渠道,要不然不会发出通知,代码修改如下:
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.NotificationCompat;import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.graphics.BitmapFactory;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;public class MainActivity extends AppCompatActivity implements View.OnClickListener {NotificationManager manager ;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Button sendNotice = findViewById(R.id.send_notice);sendNotice.setOnClickListener(this);manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);}@Overridepublic void onClick(View view) {switch (view.getId()){case R.id.send_notice://高版本需要渠道if(Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O){//只在Android O之上需要渠道NotificationChannel notificationChannel = new NotificationChannel("myChannelId","channelname",NotificationManager.IMPORTANCE_HIGH);//如果这里用IMPORTANCE_NOENE就需要在系统的设置里面开启渠道,通知才能正常弹出manager.createNotificationChannel(notificationChannel);}Notification notification = new NotificationCompat.Builder(this,"myChannelId").setContentTitle("This is content title").setContentText("This is content text").setWhen(System.currentTimeMillis()).setSmallIcon(R.mipmap.ic_launcher).setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher)).build();manager.notify(1,notification);break;default:break;}}
}
关键代码就在下面这段代码,其目的就是为了注册渠道,之后就可以使用这个channelId来发通知了。
if(Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O){//只在Android O之上需要渠道NotificationChannel notificationChannel = new NotificationChannel("myChannelId","channelname",NotificationManager.IMPORTANCE_HIGH);//如果这里用IMPORTANCE_NOENE就需要在系统的设置里面开启渠道,通知才能正常弹出manager.createNotificationChannel(notificationChannel);}
结果如下: