一、在CMakeLits.txt配置
1.添加头文件路径 include_directories(include)
2.设置三方库所在的位置 set(FF ${CMAKE_CURRENT_SOURCE_DIR}/库的所在路径)
3.添加所在的库 add_library(avcodec(三方库的名字) SHARED IMPORTED)
4. 动态链接添加的库 target_link_libraries
build.gradle(app)externalNativeBuild {
cmake {
cppFlags "-std=c++11"
}
ndk{
abiFilters "armeabi-v7a x86不同的版本"
}
}
//设置资源文件路径
sourceSets {
main{
jniLibs.srcDirs = ['libs'] ---->libs是放三方的so文件的,和src同一级目录
}
}
5.常用的命令去快速搜索
grep 关键字 . -srn : 所有代码包含这个关键字
find . -name CallFeaturesSettingsTree.java(文件名字) : 当前目录下搜索这个文件的位置
keytool -printcert -jarfile xxx.apk ------> 查看app的MD5一些信息
二、引导界面 : ViewPager+Fragment来实现
adapter.registerDataSetObserver(indicator.getDataSetObserver()); ----->去监听数据发生变化
三、侧滑列表 : DrawerLayout(侧滑窗体) + ScrollView
四、首页界面的搭建 :
我的音乐,我的推荐,我的视频三个AppBar构建 : AppBarLayout + ViewPager + Fragment
我的推荐之推荐、朋友、电台界面构建 : MagicIndicator + ViewPager + Fragment
推荐界面的搭建 : GridLayoutManager + RecyclerView
歌单的实现 : 自定义LineLayout 重写OnMeasure 实现宽高相等, RelativeLayout 包裹图片()和文字 + CardView(设置为圆角和阴影的样子)
轮播广告以及下面四个的实现 : RelativeLayout作为主父局, 定义一个背景为红色的View,上面嵌套一个Banner(轮播的控件),再实现下面四个属性
五、onNewIntent 的使用以及注意事项
解释 : 如果一个Activity已经启动过,并且存在当前应用的Activity任务栈中,为了防止它再次启动创建新的实例,就会走onNewInetnt这个方法
1.当ActivityA的LaunchMode为SingleTop时:
如果ActivityA在栈顶,且现在要再启动ActivityA,这时会调用onNewIntent()方法 ,生命周期顺序为:onCreate--->onStart--->onResume---onPause>onNewIntent--->onResume
2.当ActivityA的LaunchMode为SingleInstance,SingleTask:如果ActivityA已经在堆栈中,那么此时会调用onNewIntent()方法,生命周期调用顺序为:
onCreate--->onStart--->onResume---按下Home键>onPause--->onstop--->onNewIntent--->onRestart--->onstart--->onResume
3.这里面有个注意事项
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);//设置新的intent
int data = getIntent().getIntExtra("tanksu", 0);//此时的到的数据就是正确的了
}
在这里,如果你没有调用setIntent()方法的话,则getIntent()获取的intent都只会是最初那个intent,这里很重要
PlayListManagerImpl 监听广播接收器 onNewIntent
https://www.kancloud.cn/alex_wsc/androids#/catalog ----->一篇很不错的网址
https://www.jianshu.com/p/edcca8d3dd00 -------->OOM的问题,lottie框架解决帧动画
http缓存方式 : 对比缓存和强制缓存