年前学习网易云因为app,想着学习网易云app的界面以及功能开发。年前那会刚毕业没多久,技术能力一般,项目就只是用了mvp框架,用了很多第三方。然后最近拿来在原来基础上进行完善顺便学习一下音乐的各种播放api。
首先就需要音乐来源,然后我百度了网易云音乐API(网上好多):
,当然了我选择的自己搭建的,你也可以去github按照教程一步一步来,看到这个界面就表示成功了。
这里假设上一步你已经实现啦,下面是一些项目基本配置:
首先是项目根目录功能引用:
dependencies {
classpath 'com.android.tools.build:gradle:3.5.3'
classpath 'com.jakewharton:butterknife-gradle-plugin:10.2.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
google()
jcenter()
maven { url "https://jitpack.io" }
}
}
项目目录build.gradle配置(因为涉及多dex的配置,我就直接贴全了):
android {
compileSdkVersion 30
buildToolsVersion "30.0.3"
defaultConfig {
applicationId "com.tobey.jianyimusic"
minSdkVersion 16
targetSdkVersion 30
versionCode 1
versionName "1.0"
multiDexEnabled true
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
dexOptions { //优化dex配置
dexInProcess true
preDexLibraries true
javaMaxHeapSize "2g" //Java SDK 64位
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
//第三方引用开始
implementation 'androidx.coordinatorlayout:coordinatorlayout:1.0.0'
//黄油刀
implementation 'com.jakewharton:butterknife:10.2.0'
annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.0'
//权限
implementation 'com.permissionx.guolindev:permissionx:1.4.0'
//glide引用
implementation 'com.github.bumptech.glide:glide:4.11.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'
//网络请求retrofit
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
//RxJava
implementation 'io.reactivex.rxjava2:rxjava:2.1.7'
//RxAndroid
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
//Retrofit 支持Rxjava 的支持库
implementation 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'
//rxjava框架
implementation 'com.trello.rxlifecycle2:rxlifecycle-components:2.1.0'
implementation 'com.google.code.gson:gson:2.8.0'
implementation 'com.squareup.retrofit2:converter-gson:2.1.0'
// MultiDex的依赖
implementation 'androidx.multidex:multidex:2.0.0'
//吐司
implementation 'com.hjq:toast:8.6'
// CookieJar
implementation 'com.github.franmontiel:PersistentCookieJar:v1.0.1'
}
代码中关于activity堆栈式管理类AppManager
参考博文Android实现全局前后台监听
public class App extends Application {
private static App instance;
//多核优化冷启动初始化
private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();
private static final int CORE_POOL_SIZE = Math.max(2,Math.min(CPU_COUNT-1,4));
private CountDownLatch mCountDownLatch = new CountDownLatch(1);
// 单例模式获取唯一的Application实例
public static Application getInstance(){
return instance.getApplication();
}
@Override
public void onCreate() {
super.onCreate();
instance = this;
Looper.myQueue().addIdleHandler(new MessageQueue.IdleHandler() {
@Override
public boolean queueIdle() {
//空闲时初始化,toast在主线程初始化,子线程会崩溃(不做looper等的修改)
ToastUtils.init(instance,new ToastQQStyle(instance));
return false;
}
});
ExecutorService pool = Executors.newFixedThreadPool(CORE_POOL_SIZE);
pool.submit(new Runnable() {
@Override
public void run() {
mCountDownLatch.countDown();
}
});
pool.submit(new Runnable() {
@Override
public void run() {
//第三方初始化
}
});
try {
//如果await之前没有调用countDown那么就会一直阻塞在这里
mCountDownLatch.await();
}catch (InterruptedException e){
e.printStackTrace();
}
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) {
WeakReference<Activity> weakReference = new WeakReference<>(activity);
AppManager.getAppManager().addActivity(weakReference);
}
@Override
public void onActivityStarted(@NonNull Activity activity) {
}
@Override
public void onActivityResumed(@NonNull Activity activity) {
}
@Override
public void onActivityPaused(@NonNull Activity activity) {
}
@Override
public void onActivityStopped(@NonNull Activity activity) {
}
@Override
public void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState) {
}
@Override
public void onActivityDestroyed(@NonNull Activity activity) {
WeakReference<Activity> weakReference = new WeakReference<>(activity);
AppManager.getAppManager().removeActivity(weakReference);
}
});
}
private Application getApplication() {
return this;
}
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(base);
}
}
然后记得要在AndroidManifest.xml配置文件中声明Appandroid:name=".App"
,然后在配置文件中添加对应部分权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<uses-permission android:name="android.permission.BROADCAST_STICKY" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
到目前为止,最初的项目配置已经初步完成了,第二篇请看Android音乐App开发准备( 简易音乐 二 )(关于混淆暂时先不配置),如果觉得写的不错的话记得点个赞 嗷~~