开发自制浏览器的过程中,学习使用了Service服务和Notification通知,下载m3u8格式视频文件,记录分享给小伙伴们。
一、依赖配置
开发用到的Android Sdk版本为32,额外用到的依赖主要是一个解密包 bcprov-jdk16-139.jar,本地引用的,放置于Android项目app目录下新建的libs文件夹中,jar包下载地址传送,补充百度网盘下载,build.gradle(app目录下)中引用方式如下
dependencies {
implementation 'androidx.appcompat:appcompat:1.4.1'
implementation 'com.google.android.material:material:1.5.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
implementation 'org.apache.commons:commons-lang3:3.7'
implementation files('libs\\bcprov-jdk16-139.jar')
}
二、清单文件配置,设置权限,配置Service
需注意,高版本网络访问和文件读写得在application标签属性中配置这俩usesCleartextTraffic="true" 、 requestLegacyExternalStorage="true"
<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<!-- 网络权限 -->
<uses-permission android:name="android.permission.INTERNET" /> <!-- 下载时 安卓6.0以下的直接将读写权限写入AndroidManifest.xml之中 -->
<uses-permission
android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<!--通知权限、-->
<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM"/>
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
<!--存储权限-->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:hardwareAccelerated="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/NoTitle"
android:requestLegacyExternalStorage="true"
android:usesCleartextTraffic="true"
tools:targetApi="31">
<service
android:name=".service.DownloadService"
android:enabled="true"
android:exported="true"></service>
<activity
android:name=".activity.MainActivity"
android:exported="true"
android:launchMode="singleTop">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data
android:name="android.app.lib_name"
android:value="" />
</activity>
<activity
android:name=".activity.BrowserActivity"
android:configChanges="orientation|screenSize"
android:exported="false"
android:hardwareAccelerated="true"
android:launchMode="singleTop">
<meta-data
android:name="android.app.lib_name"
android:value="" />
</activity>
</application>
</manifest>
三、导航栏通知,用到的视图相关xml文件
progress_bar.xml,一般放置于drawable目录下
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<!-- 进度条背景色 -->
<item android:id="@android:id/background">
<shape>
<corners android:radius="5dip" />
<gradient
android:startColor="#D8D8D8"
android:centerColor="#D8D8D8"
android:centerY="0.75"
android:endColor="#D8D8D8"
android:angle="270"
/>
</shape>
</item>
<!-- 第二进度条 -->
<item android:id="@android:id/secondaryProgress">
<clip>
<shape>
<corners android:radius="5dip" />
<gradient
android:startColor="#b9a4ff"
android:centerColor="#c6b7ff"
android:centerY="0.75"
android:endColor="#c3b2ff"
android:angle="270"
/>
</shape>
</clip>
</item>
<!-- 进度条 -->
<item android:id="@android:id/progress">
<clip>
<shape>
<corners android:radius="5dip" />
<gradient
android:startColor="#AEAEAE"
android:centerColor="#AEAEAE"
android:centerY="0.75"
android:endColor="#AEAEAE"
android:angle="270"
/>
</shape>
</clip>
</item>
</layer-list>
notification_download.xml,一般放置于layout目录下
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@color/colorLightGray1">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center">
<ImageView
android:id="@+id/ivLogo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@color/colorLightGray1"
android:layout_margin="10dip" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_weight="1"
android:layout_marginRight="14dip">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/gray2"
android:text="自制浏览器下载任务"
android:textSize="14dip"
android:textStyle="bold"/>
<ProgressBar
android:id="@+id/pbDownload"
android:layout_width="fill_parent"
android:layout_height="6dip"
android:layout_marginTop="6dip"
android:layout_marginBottom="3dip"
android:progress="0"
android:max=