Android音乐App开发准备( 简易音乐 一 )
- 关于
- 第一步,获取音乐来源
- 第二步,开发环境
- 第三步,引用三方
- 第四步,添加唯一进程App.java
 
关于
年前学习网易云因为app,想着学习网易云app的界面以及功能开发。年前那会刚毕业没多久,技术能力一般,项目就只是用了mvp框架,用了很多第三方。然后最近拿来在原来基础上进行完善顺便学习一下音乐的各种播放api。
第一步,获取音乐来源
  首先就需要音乐来源,然后我百度了网易云音乐API(网上好多):
 
,当然了我选择的自己搭建的,你也可以去github按照教程一步一步来,看到这个界面就表示成功了。
第二步,开发环境
这里假设上一步你已经实现啦,下面是一些项目基本配置:
- 开发工具 android studio 3.5.3
- 开发语音 JAVA
- 主要使用技术 butterknife+retrofit2+rxjava2+glide(基本的就是这样,后面还会有其他的会再介绍)
第三步,引用三方
首先是项目根目录功能引用:
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 30buildToolsVersion "30.0.3"defaultConfig {applicationId "com.tobey.jianyimusic"minSdkVersion 16targetSdkVersion 30versionCode 1versionName "1.0"multiDexEnabled truetestInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"}dexOptions { //优化dex配置dexInProcess truepreDexLibraries truejavaMaxHeapSize "2g" //Java SDK 64位}buildTypes {release {minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'}}compileOptions {sourceCompatibility JavaVersion.VERSION_1_8targetCompatibility 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'//网络请求retrofitimplementation 'com.squareup.retrofit2:retrofit:2.9.0'//RxJavaimplementation 'io.reactivex.rxjava2:rxjava:2.1.7'//RxAndroidimplementation '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'// CookieJarimplementation 'com.github.franmontiel:PersistentCookieJar:v1.0.1'
}
第四步,添加唯一进程App.java
  代码中关于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();}@Overridepublic void onCreate() {super.onCreate();instance = this;Looper.myQueue().addIdleHandler(new MessageQueue.IdleHandler() {@Overridepublic boolean queueIdle() {//空闲时初始化,toast在主线程初始化,子线程会崩溃(不做looper等的修改)ToastUtils.init(instance,new ToastQQStyle(instance));return false;}});ExecutorService pool = Executors.newFixedThreadPool(CORE_POOL_SIZE);pool.submit(new Runnable() {@Overridepublic void run() {mCountDownLatch.countDown();}});pool.submit(new Runnable() {@Overridepublic void run() {//第三方初始化}});try {//如果await之前没有调用countDown那么就会一直阻塞在这里mCountDownLatch.await();}catch (InterruptedException e){e.printStackTrace();}registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {@Overridepublic void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) {WeakReference<Activity> weakReference = new WeakReference<>(activity);AppManager.getAppManager().addActivity(weakReference);}@Overridepublic void onActivityStarted(@NonNull Activity activity) {}@Overridepublic void onActivityResumed(@NonNull Activity activity) {}@Overridepublic void onActivityPaused(@NonNull Activity activity) {}@Overridepublic void onActivityStopped(@NonNull Activity activity) {}@Overridepublic void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState) {}@Overridepublic void onActivityDestroyed(@NonNull Activity activity) {WeakReference<Activity> weakReference = new WeakReference<>(activity);AppManager.getAppManager().removeActivity(weakReference);}});}private Application getApplication() {return this;}@Overrideprotected 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开发准备( 简易音乐 二 )(关于混淆暂时先不配置),如果觉得写的不错的话记得点个赞 嗷~~


















