3.23 星期二
Android对话框处理
// 提示对话框 构建器 alertdialog
// 自定义对话框 重点
// PopupWindow 弹窗 基础配置 动画
// ArrayAdapter 数组适配器 对话框
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="vertical">
<Button
android:id="@+id/normal_dialog_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="显示一个普通对话框"
android:onClick="myClick"/>
<Button
android:id="@+id/diy_dialog_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="显示一个自定义对话框"
android:onClick="myClick" />
<Button
android:id="@+id/popup_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="显示弹窗"
android:layout_gravity="center_horizontal"
android:onClick="myClick" />
<Button
android:id="@+id/arrayAdapter_btn"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="显示数组对话框"
android:layout_gravity="center_horizontal"
android:onClick="myClick" />
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center_horizontal"
android:background="@mipmap/dialog_bg">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="真的要退出吗?"
android:textSize="34sp"
android:textColor="#e61414"
android:textStyle="bold"
android:layout_marginTop="265dp"/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_margin="25dp">
<Button
android:id="@+id/yes_btn"
android:layout_width="120dp"
android:layout_height="50dp"
android:background="@mipmap/yes_btn"/>
<Button
android:id="@+id/no_btn"
android:layout_width="120dp"
android:layout_height="50dp"
android:background="@mipmap/no_btn"
android:layout_marginLeft="20dp"/>
</LinearLayout>
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="10dp"
android:gravity="center_vertical">
<ImageView
android:id="@+id/item_icon"
android:layout_width="40dp"
android:layout_height="40dp"
android:src="@mipmap/star"/>
<TextView
android:id="@+id/item_txt"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="测试"
android:layout_marginLeft="15dp"/>
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:background="#00ffff"
android:padding="2dp"
>
<TextView
android:id="@+id/choose"
android:layout_width="60dp"
android:layout_height="30dp"
android:text="选择"
android:textColor="#ffffff"
android:gravity="center"
android:background="#000000"/>
<View
android:layout_width="2dp"
android:layout_height="30dp"
android:background="#00ffff" />
<TextView
android:id="@+id/choose_all"
android:layout_width="60dp"
android:layout_height="30dp"
android:text="全选"
android:textColor="#ffffff"
android:gravity="center"
android:background="#000000"/>
<View
android:layout_width="2dp"
android:layout_height="30dp"
android:background="#00ffff" />
<TextView
android:id="@+id/copy"
android:layout_width="60dp"
android:layout_height="30dp"
android:text="复制"
android:textColor="#ffffff"
android:gravity="center"
android:background="#000000"/>
</LinearLayout>
package com.example.dialogdemo;
import android.content.DialogInterface;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.PopupWindow;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void showNormalDialog(){
AlertDialog dialog = new AlertDialog.Builder(this).create();
dialog.setTitle("提示");
dialog.setMessage("您确定退出程序吗?");
dialog.setButton(DialogInterface.BUTTON_POSITIVE, "确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
}
});
dialog.show();
}
public void myClick(View view) {
switch (view.getId()){
case R.id.normal_dialog_btn:
//AlertDialog的构造方法时protected
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("提示");
builder.setMessage("您确定退出程序吗?");
builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
finish();
}
});
builder.setNegativeButton("取消",null);
builder.show();
// AlertDialog dialog = builder.create();
// dialog.show();
break;
case R.id.diy_dialog_btn:
MyDialog md = new MyDialog(this,R.style.mydialog);
md.show();
break;
case R.id.popup_btn:
showPopupWindow(view);
break;
case R.id.arrayAdapter_btn:
showArrayDialog();
break;
}
}
private void showArrayDialog() {
final String[] items = {"Java","Mysql","Android","HTML","C","JavaScript"};
//数组适配器
//参数1:环境
//参数2:布局资源索引,指的是每一项数据所呈现的样式android.R.layout.xxx
//参数3:数据源
// ArrayAdapter adapter = new ArrayAdapter(this,android.R.layout.simple_dropdown_item_1line,items);
ArrayAdapter adapter = new ArrayAdapter(this,R.layout.array_item_layout,R.id.item_txt,items);
AlertDialog.Builder builer = new AlertDialog.Builder(this)
.setTitle("请选择")
//参数1:适配器对象(对数据显示样式的规则制定器)
//参数2:监听器
.setAdapter(adapter, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
Toast.makeText(MainActivity.this,items[i],Toast.LENGTH_SHORT).show();
dialogInterface.dismiss();
}
});
builer.show();
}
//设置PopupWindow
public void showPopupWindow(View view) {
//准备弹窗所需要的视图对象
View v = LayoutInflater.from(this).inflate(R.layout.popup_layout,null);
//1.实例化对象
//参数1:用在弹窗中的View
//参数2、3:弹窗的宽高
//参数4(focusable):能否获取焦点
final PopupWindow window = new PopupWindow(v,190,35,true);
//2.设置(背景、动画)
//设置背景
window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
//设置能响应外部的点击事件
window.setOutsideTouchable(true);
//设置能响应点击事件
window.setTouchable(true);
//①创建动画资源 ②创建一个style应用动画资源 ③对当前弹窗的动画风格设置为第二部的资源索引
window.setAnimationStyle(R.style.translate_anim);
//3.显示
//参数1(anchor):锚
//参数2、3:相对于锚在x、y方向上的偏移量
window.showAsDropDown(view,-190,0);
//为弹窗中的文本添加点击事件
v.findViewById(R.id.choose).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this,"您点击了选择",Toast.LENGTH_SHORT).show();
window.dismiss(); //控制弹窗消失
}
});
v.findViewById(R.id.choose_all).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this,"您点击了全选",Toast.LENGTH_SHORT).show();
window.dismiss();
}
});
v.findViewById(R.id.copy).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this,"您点击了复制",Toast.LENGTH_SHORT).show();
window.dismiss();
}
});
}
}
package com.example.dialogdemo;
import android.app.Dialog;
import android.content.Context;
import android.support.annotation.NonNull;
import android.view.View;
public class MyDialog extends Dialog {
public MyDialog(@NonNull final Context context, int themeResId) {
super(context, themeResId);
//为对话框设置布局
setContentView(R.layout.dialog_layout);
findViewById(R.id.yes_btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
System.exit(0);
}
});
findViewById(R.id.no_btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
dismiss();
}
});
}
}
anim
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromXDelta="0"
android:toXDelta="0"
android:fromYDelta="300"
android:toYDelta="0"
android:duration="2000"
></translate>
</set>
styles
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
<style name="mydialog" parent="android:style/Theme.Dialog">
<item name="android:windowNoTitle">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
</style>
<style name="translate_anim">
<item name="android:windowEnterAnimation">@anim/translate</item>
</style>
</resources>
3.24 星期三
activity生命周期
//
// activity第一条生命周期 logt创建TAG oncreat onstart onresume onpause onstop ondestory onrestart
// 其他分支 返回键触发 销毁的时候保存数据
// 重构 提取 变成变量
// activity之间的数据传递 防御式编程 直接putextra 2.创建bundle 3 序列化 B传给A setresult
// 处理数据和状态
https://github.com/yuxiaoss/Android-
Fragment 创建和使用
// 概述 有什么用 解决分辨率适配问题 平板 手机 生命周期
// 静态加载的应用 用v4 提取出单独的类 重构 refactor 在xml中 布局中使用
// 动态加载 在代码中加载
// activity向fragment传值 Bundle 提取常量 复用
// 回调 fragment向activity传值 callback
https://github.com/yuxiaoss/Fragment-
3.25 星期四
Viewpager 实现导航效果
// Viewpager 引导界面、相册多图片预览 多tab页面、APP导航 广告播放
// support包 依赖包 支持特性 arr
// 适配器把视图和数据联系起来 重构 提取方法 变量 常量
// 实现最简单的viewpager
// 使用viewpager实现APP导航页
// fragment配合viewpaper
// 实现底部导航布局 图标 选择器 选择变颜色 变图标
// 实现导航事件联动 fragmentpageadapter 常见tab切换效果
// support包
https://github.com/yuxiaoss/ViewPager
3.26 星期五
幕掏实战
// 幕掏旅游 com.tao.imtao adapter entity util 样式修改标题
// 闪屏页
// 主界面 mainactivity功能菜单 选择器Selector主要用来改变一些控件的默认背景
// 主界面 功能内容 fragment
// 我的实现 头部 fragment
// 我的实现 滚动列表
https://github.com/yuxiaoss/mutao1
3.29 星期一
Android网络操作
网络基础知识
// 网络基础知识 http协议应用层 TCP三次握手 客户端 服务端 URL解析
// 网络请求 请求方式 get获取数据在 url后面 不对服务器不做更改 post提交数据 从服务器获取数据
// get请求 原生实现 另一个线程子线程 使用 在manifests声明网络
// 主线程UI线程用来对控件的控制 更新控件只能在UI线程 因为在死循环等待控件使用
// 对http API29 res 添加xml文件 在manifests 添加申明 app文件目标版本号29api
// post请求 配置缓存取消 参数处理 data数据 encode 输出流数据
// 解析数据 json数据的解析 java.net
https://github.com/yuxiaoss/Android-intent-get-post
handler通信
// 主线程 UI线程activitythread 线程不安全 性能 线程安全 加锁 消息循环机制死循环
// 应用场景 定时任务 线程之间使用
// handler方法使用 主线程改变视图 子线程大量耗时的操作 sendmessage post mainactivity
// 异步下载文件并更新进度条 downloadactivity
// 倒计时的实现 优化handler内存泄漏 os.handler comtime mainactivity
// 强引用 主动释放 弱引用 为null 就被垃圾回收器回收了 静态 activity用完了,就垃圾回收
// 打地鼠案例 handler运行原理 主线程 handler looper message messagequeue
https://github.com/yuxiaoss/handler
AsyncTask异步任务
// AsyncTask 异步任务 吃饭 看电视同时进行 handler封装
// 多个线程 ANR 耗时操作的时候 UI Theard Worker Thread 线程不安全 多线程使用更改数据 安全 加锁后不会更改数据 主线程更新
// asynctask重用方法详解 泛型参数 可变参数
// 异步下载实现demo 申请权限
// ctrl + shift +上 顺序执行 异步执行完,执行下一个 内存泄漏 线程池
https://github.com/yuxiaoss/AsyncTaskProject
3.30 星期二
高级控件
ListView展示列表数据
// 01 ListView展示列表数据
// 应用场景 列表通讯录 短信 聊天界面 本质还是控件 view
// adapter 适配器 用来适配数据和控件
// listview 实现步骤
// adapter 数据绑定 创建item布局变成view 数据放在view里
// listview简单应用
// 获取系统已安装应用列表 列表优化 将layout优化view 只加载一次 viewHolder 优化列表样式 加载性能优化
https://github.com/yuxiaoss/-ListViewDisplay-list-data
ListView实现隔行效果
网络下载数据并显示 使用异步访问网络 URL AsyncTask
解析获取json对象 json转对象 GSON fastjson开源库 request
加载数据到listview RequestDataAdapter BaseAdapter 调试 申请权限 gone彻底消失 footerview
// 引用不同的行布局 chatActivity 数据 charMessage
https://github.com/yuxiaoss/LISTVIEWAchieve-interlacing-effect
CardView实现卡片布局效果
// cardview基础 案例实现 添加3D阴影和圆角效果
//常用属性
// build.gradle 添加依赖
// 案例 布局搭建 实体类创建 Msg MsgLab 功能实现MainActivity MsgAdapter
// 适配 value-v21 用属性 资源限定符 内容与圆角重叠 cardusecomptpadding foreground效果
https://github.com/yuxiaoss/CardView
屏幕适配
// 屏幕适配 屏幕尺寸 分辨率px 像素密度dpi 每英寸
// px 像素 dip dp 160dpi sp字体大小
// ldpi mdpi hdpi xdpi
// 屏幕适配技巧 布局适配 少用px
// 图片适配 点9图 使用自动拉伸图
https://github.com/yuxiaoss/Screen-adaptation-
3.31 星期三
数据存储
Android本地文件操作
// android 常用数据存储
//sharepreference 使用 存放类似登录的配置信息 xml文件 shared_prefs 键值对方式 操作模式
// ShareActivity 存放 使用信息
// 外部存储externalstorage 内存memory 内部存储 internalstorage externalstorage
// storage mnt文件夹 公有目录 私有目录 应用包名
// 外部存储的操作externalActivity 加权限 写的权限 映射文件l 动态权限 获取外部存储目录files 临时文件 cache
// 内部存储app data internalactivity 一般先试用外部存储
// filenotfound异常解决方案 路径 权限处理 设备有没有sdcard
// DDMS中的data、sdcard目录无法展开
https://github.com/yuxiaoss/-Android-local-file-operation-
02 Android数据库操作
// sqlite数据库 轻量级 关系型数据库 记录 字段 属性 域
// sqlite expert 工具 建库 建表 DDL 数据库定义语音
// DML 数据库操作语音 添加语句 insert into 表 (字段)values(值)
// 删除语句delete from 表 删除行
// 修改语句 update 表 set 列名 = 更新值 where
// 查询语句select * 字段 列 form 表 where 条件 gender=“男”
// Android中对sql语句 界面布局
// SQLiteOpenHelp类的作用 创建 打开数据库
// sqlitedatabase类的操作 增删改查 创建表 查找表 下划线id adapter不能识别 清除数据
// API操作数据库 MainActivity2
// 数据查询 group by 分组
// 使用面向对象思想封装数据库操作(进阶)
// DAO data access object 可变长度的参数 删除操作 修改
https://github.com/yuxiaoss/Android-database-operation
手风琴特效 expandablelistview 可扩展
// 联系人分组
// 案例开发 bean创建 chapter类 分组条目 chapteritem子条目
// 适配器实现 adapter tools
// 模拟数据创建 chapterlab
// expandablelistview属性方法设置 layout属性 父类属性 inflate
// 复杂案例 数据逻辑处理 chapterBiz 网络数据处理 utils
// Biz业务逻辑实现 chapterdbhelper
// UI实现层
https://github.com/yuxiaoss/ExpandableListView
broadcastreceived 广播接收器 组件之一
// 基础概念WiFi到流量 注册 静态注册限制 动态注册
// 注册监听系统广播 静态注册系统广播 系统广播 manifest 四大组件声明 静态注册广播 imoocbroadcastreceiver
// 动态注册系统广播 可以取消掉
// 生命周期 最大执行10秒 主线程 取消注册 内存泄漏 合适的地方使用广播
// 自定义广播 重点 内存泄漏 APP间的广播 build.gradle
https://github.com/yuxiaoss/broadcastreceived
APPlication类实现
// 自定义application类 framwork层
// 生命周期 进程消失 系统管理
// 回调方法
// Application对象作用 全局变量
// 静态单例 Otto 尽量用单例
https://github.com/yuxiaoss/Application
4.01 星期四
流行框架
01 OkHttp网络操作框架
// okio 包 解决io包的问题 添加包的问题 依赖 对javaio
// I/O 输入输出 程序的角度 内存 buffer
// bytestring类 encodeutf8 处理数据
// okio - buffer 提高读写效率 输入流 source 输出流 sink 访问数据 存储数据
// Okio.buffer 方法
// OkHttp Dependencies添加依赖 清单文件 网络请求 OKhttpdemo request
// get - response 异步请求
// post
https://github.com/yuxiaoss/OkHttp
4.02 星期五
02 EventBus事件总线 进行事件的发布和订阅
// 案例 基础activity 监听 发布publisherDialogFragment 耦合到一起
// 使用本地广播通信 接收广播 注册监听 解析action 发送广播 鉴别广播
// EventBus入门 中介 事件 订阅 发布 添加依赖机器人的 subscribe 注册注解
// UI线程 更新界面 后台线程 耗时操作
// POSTING线程模式 postingevent 默认的线程模式 发布和监听接收都在一个线程
// main 线程模式 订阅 实在主线程 定义事件mainevent 订阅回调函数都是在主线程 可以更新界面
// main_ordered 发布方不会被阻塞
// 创建事件类型 添加处理事件订阅回调 backgroudevent 处理事件运行在后台线程
// ASYNC 订阅方在一个新线程
// sticky粘性事件 先发布 后订阅
// 配置 proguard rules混淆规则 告诉构建函数保留订阅回调函数
// 事件-订阅-发布 threadmode 订阅回调函数运行的线程模式
https://github.com/yuxiaoss/EventBus
4.03 星期六
recyclerView 瀑布流的布局
展示大量数据
// 工作流程 灵活可配置 布局管理 layoutmanager adapter viewholder 数据 适配器 布局管理器 不同的展示效果
//RecyclerView数据显示(重点)依赖 引用recycleview
// 线性布局 刷新adapter方法 反向数据 设置LinearLayoutmanager
// 设置网格布局 瀑布流布局
4.04 星期天
Glide图片流行框架
加载图片
// 原生代码加载网络图片 注意事项 图片过大 内存溢出 网络安全xml配置文件
// Glide基本用法 加载glide库 配置使用流程 配置glide
// glide 高级用法generated API 支持库 全局变量的配置 常用方法 占位图
https://github.com/yuxiaoss/glide
4.05 星期一
GreenDao数据库框架
// ORM greendao引用GitHub地址 build.gradle
// 创建数据库会话 注解 Entity 实体类 Markproject
// UI介绍 notifyDataSetChanges 通知UI数据发声变化
// 插入数据greendaomanager
// 数据查询 删除和修改数据 onsure 重新查询
// 数据库加密 引入 用Markproject生成
https://github.com/yuxiaoss/GreenDao
4.06 星期二
极光推送 服务器端发送的通知
// 实现推送的方式 客户端定时轮询 客户端与服务器的长连接
// 短连接 长连接 始终保持连接 实现原理
// Android常用推送平台 GCM 极光推送 jpuch UPuch
// 集成极光推送 注册 登录 SDK集成
// 下载SDK jar包在libs里 os文件 激活jpush
// 自定义消息 通知消息
// 极光推送的高级应用
https://github.com/yuxiaoss/jPush
4.07 星期三
webview ui组件
// 常用方法 重点
// 加载网页的四种方式 loadURL(String) 判断版本使用调试
// 控制网页的前进和后退 样式 大写效果
// 状态管理 onresume activity声明周期
// 常用类
// 对webview进行配置和管理websettingsz 控制JS代码 控制网页的缩放
// 控制webview缓冲策略 清理缓存
// webviewClient类 处理网页加载时的各种回调通知
// 资源请求回调方法 return 非空
// 地址拦截 shouldoverrideurlloading 重写加载新的url回调
// 发送错误时的处理 回调 请求新的地址
// webchromeclient类 处理页面信息 对话框 标题 进度等
// Android webview 与JS交互 去调用JS代码 alert方法 loadURL 直接取值
// JS调用Android代码 通过拦截JS请求回调方法 对象映射onandroidfunction
https://github.com/yuxiaoss/webview
4.08 星期四
ButterKnife实现View注入
// 使用方法
// 引入依赖库 绑定view 资源 事件
// 注入listview事件 注入recycleview
// butterknife zelezny 插件学习 选中activity资源绑定控件
// 分析源码 反射代码 项目 慕课电影
https://github.com/yuxiaoss/ButterKnife
4.09 星期五
百度地图
第三方SDK 下载demo 查看文档
// 创建应用 获取SHA1 生成keystore 文件 创建apk 添加jar 依赖 混淆配置
// 运行示例 地图切换
// 权限处理 获取经纬度
// 定位功能实现 图标的角度
// 添加商家marker
// 显示商家信息
https://github.com/yuxiaoss/Baidumap
4.10 星期六
项目实战
仿外卖开发点餐APP
// 基础功能实现
// 工程创建与素材准备
// 闪屏页实现splashactivity 内存泄漏 没有全屏 设置声明设置 主题的编写
// 登录页实现 登录按钮 有样式设置点击的学习 finish
// 注册页面实现 include baseactivity
// 数据介绍一级biz 业务相关的类 UI bean业务 httpOK网络请求 Picasso图片 jarjson包
// net commoncallback类 获取type类型 泛型的类型
// 登录业务实现 utils T 封装tasto reqapplication 初始化 gson 保存登录信息 和cookie 用静态方法 移除cookie
// 注册业务逻辑实现
// 订单实现 自定义点击事件 上拉 下拉
// 商品展示界面 业务实现 立即支付 back后是登录状态
// 商品详情页 订单详情页
https://github.com/yuxiaoss/Takeaway-orderAPP
4.11 星期天
开发阅读器 小慕阅读
// 开发阅读器 小慕阅读
// 使用GitHub加载第三方库的介绍 网络请求loopj gson bookview
// 流程分析
// Splash界面 闪屏页实现 由上往下布局 handler倒计时 内存泄漏 对activity进行弱引用 rkkhandler rkk LIVE temp设置
// 消息池 不用new 跳到下一个页面
// 新建下一个页面 书籍列表界面 请求网络 json 转换对象 用注解找对应的key plugins插件 gsonformat 显示数据列表
// 下载书籍 乱码 点击下载 下载失败 点击打开
// 加载书籍 引用书本的类view 全屏的显示 书籍进度
// 设置界面布局 中间点击事件 做回调 设置界面菜单
// 设置书签 封装打开书籍方法 重绘 设置背景
// 语音朗读 第三方的SDK 系统的 跳转进度
https://github.com/yuxiaoss/BookApplication
4.12 星期一
Android高级应用
sercice 基础
// service基础
// 四大组件 没有界面的activity 在后台处理耗时操作 不受activity生命周期影响
// 启动服务 生命周期 startservice() oncreate onstartCommand stopservice() onDestory
// 绑定服务 bindservice oncreate onBind unbindservice onUnbind onDestory()
// 实现IBinder 接口 实现进度监控
// serviceConnecttion 用于绑定客户端和service
// 进度监控
https://github.com/yuxiaoss/service
4.13 星期二
02 AIDL实现远程服务的通信
// Android interface definition language 进程间的通信接口
// 服务的启动及绑定
// 远程启动服务 应用之间启动 声明service 配置文件
// 远程绑定服务 绑定的时候自动创建服务
// 创建AIDL文件 两个进程中间数据共享 build 自动生成java文件
// 实现AIDL
// 远程监控服务进度
https://github.com/yuxiaoss/AIDL
4.14 星期三
03 ContentProvider初体验
四大组件之一
// ContentProvider和他的兄弟(重点) 配置 uri 提供目标地址 contentresolver
// contentprovider中常用方法 oncreate 打开 创建 数据库
// 界面搭建
// insert方法 获取id
// query方法 数据刷新flag
https://github.com/yuxiaoss/ContentProvider
4.15 星期四
04 Socket&Https通信
https://github.com/yuxiaoss/04-Socket-Https-