之前博文《 Android 学习笔记之——服务中的下载功能》中最后的demo并没有成功,本博文对其进行debug
目录
NotificationCompat.Builder()过时,失效
Android9.0开始前台服务需要申请权限
依赖包的问题
Notification都要指定Channel(通道)
参考资料
参考资料https://blog.csdn.net/zwk_sys/article/details/79661045
在前台服务的时候,显示NotificationCompat.Builder不支持
原因是升级到Android O 版本后,该方法被以下方法取代:
NotificationCompat.Builder(Context context, String channelId)
因此代码修改如下
在app/build.gradle的android闭包中添加如下:
compileOptions{
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
这段代码是为了开启Java1.8,能够使用Lambda,因为 stream API 和接口默认实现等特性都只支持Android 7.0及以上的系统,而Lambda表达式能最低兼容到Android 2.3系统,基本上覆盖了所有的Android手机了
但是好像没有用。
这里要注意compile已经全部被implementation替代了,由于之前的项目统一用compile依赖,导致的情况就是模块耦合性太高,不利于项目拆解,使用implementation之后虽然使用起来复杂了但是做到降低偶合兴提高安全性不失为一个好办法。
改为
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.0.0-beta01'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test:runner:1.1.0-alpha4'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0-alpha4'
implementation 'com.squareup.okhttp3:okhttp:3.14.2'
}
好像也是没有用。。。。
Notification
都要指定Channel(通道)主要就是下面这个函数的修改(DownloadService.java)
和书上的代码有区别主要原因是在Android 8(API 26)之后引入了Channel,所有的Notification
都要指定Channel(通道),对于每一个Channel你都可以单独去设置它;比如通知开关、提示音、是否震动或者是重要程度等;这样每个应用程序的通知在用户面前都是透明的。
private Notification getNotification(String title,int progress){
Intent intent=new Intent(this,MainActivity.class);
PendingIntent pi=PendingIntent.getActivity(this,0,intent,0);
NotificationManager manager=(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
NotificationChannel channel=null;
Uri uri= Settings.System.DEFAULT_NOTIFICATION_URI;
//Android8.0之后的版本要求设置通知渠道
if(android.os.Build.VERSION.SDK_INT>= Build.VERSION_CODES.O){
channel=new NotificationChannel("Notification","This is 2",NotificationManager.IMPORTANCE_HIGH);
channel.setDescription("This is 1");
channel.setSound(uri,Notification.AUDIO_ATTRIBUTES_DEFAULT);
manager.createNotificationChannel(channel);
}
NotificationCompat.Builder builder=new NotificationCompat.Builder(this);
builder.setSmallIcon(R.mipmap.ic_launcher);
builder.setLargeIcon(BitmapFactory.decodeResource(getResources(),
R.mipmap.ic_launcher));
builder.setWhen(System.currentTimeMillis());
builder.setContentIntent(pi);
builder.setContentTitle(title);
builder.setChannelId("Notification");
builder.setAutoCancel(true);
if(progress>=0){
//当progress大于或等于0时才显示下载进度
builder.setContentText(progress+"%");
builder.setProgress(100,progress,false);
}
return builder.build();
}
但是仍然显示下载失败???
而这里的下载失败则是由于没有在app/build.gradle的android闭包中添加如下:
compileOptions{
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
但是报错
改为更改下载链接试试
http://39.134.182.103:6510/shouji.360tpcdn.com/190531/c63afe5408b3e7418b411b091374a905/com.tencent.mobileqq_90026.apk
还是不行
首先对于Android闭包应该是这样放置
但是仍然不行。。。。。
https://www.cnblogs.com/hzauxx/p/11001285.html(写得非常好)