JSON 是 JS 对象的字符串表示法,它使用文本表示一个 JS 对象的信息,本质是一个字符串。
JavaScript Object Notation:JavaScript 对象简谱
采用完全独立于编程语言的文本格式来存储和表示数据。
JSON 数据的书写格式是:键(名称)/值对。
JSON 键值对是用来保存 JS 对象的一种方式,键/值对包括字段名称(在双引号中),后面跟一个冒号,然后是值。
JSON 值可以是:字符串(在双引号中)、数组(在中括号中)、数字(整数或浮点数)、逻辑值(true 或 false)、对象(在大括号中)、 null。
JSON结构有两种结构,对象和数组结构。
① {“name”: “李三”} 是一个包含name为李三的对象,
② [“李三”,“赵四”] 是一个包含两个元素的数组
③ [{“name”: “李三”} ,{“name”: “赵四”} ] 就表示包含两个对象的数组。
④ {“name”:[“Shanxi”,“Shandong”]}
花括弧,方括弧,冒号和逗号
①花括弧表示一个“容器”
②方括号装载数组
③数组之间的元素通过逗号隔开
④键和值用冒号隔开
1. 创建新的Repository
2. 添加Android类型的.gitignore文件,选择开源协议
.gitignore这个文件的作用就是告诉Git哪些文件不需要添加到版本管理中。
3. 获取远程版本库的Git地址
4. Git Bash进入安卓工程目录
6. 将github上的文件复制并覆盖本地文件
7. 项目提交到github
配置Git 身份
git config --global user.name “GCC”
git config --global user.email “[email protected]”
git add . ——添加版本控制
git commit -m “first commit.” ——本地执行提交操作
git push origin master ——将提交的内容同步到远程版本库
【开源网址】:
https://github.com/LitePalFramework/LitePal
对于jcenter上面的开源项目,只需要在app/build.gradle配置文件中声明该开源库的引用。
If you program with Java:
dependencies {
implementation 'org.litepal.android:java:3.0.0'
}
<litepal>
<dbname value="demo" />
<version value="1" />
<list>
list>
litepal>
由于操作数据库时需要用到Context,而我们显然不希望在每个接口中都去传一遍这个参数,那样操作数据库就显得太繁琐了。因此,LitePal使用了一个方法来简化掉Context这个参数,只需在AndroidManifest.xml中配置LitePalApplication,所有的数据库操作都不用再传Context了。
在AndroidManifest.xml里面:
<manifest>
<application
android:name="org.litepal.LitePalApplication"
...
>
...
application>
manifest>
根据对象关系映射模式的理念,每一张表都应该对应一个模型(Model),也就是说,如果我们想要建一张news表,就应该有一个对应的News模型类。新建一个User类,表中的每一列其实就是对应了模型类中的一个字段,比如表中有id、name、age 类中就也应该有这几个字段。id作为主键。
add these models into the mapping list in litepal.xml:
需要添加完整的类名,包含包的路径
<list>
<mapping class="org.litepal.litepalsample.model.Album" />
<mapping class="org.litepal.litepalsample.model.Song" />
list>
LitePal的所有映射都是自动完成的。根据LitePal的数据类型支持,可以进行对象关系映射的数据类型一共有8种,int、short、long、float、double、boolean、String和Date。只要是声明成这8种数据类型的字段都会被自动映射到数据库表中,并不需要进行任何额外的配置。
现在只要对数据库有任何操作,数据库,就会自动被创建
gets the SQLiteDatabase with following codes:
SQLiteDatabase db = LitePal.getDatabase();
import org.litepal.crud.LitePalSupport;
public class Province extends LitePalSupport {
}
Province province=new Province();
province.setxxx(xxx);
......
province.save();
【开源网址】
http://square.github.io/okhttp/
在app/build.gradle配置文件中声明该开源库引用
implementation("com.squareup.okhttp3:okhttp:4.1.1")
1.创建OkHttpClient的实例
OkHttpClient client = new OkHttpClient();
2.创建Request对象,发起Http请求
Request request = new Request.Builder()
.url("http://www.baidu.com")
.build();
3.调用OkHttpClient的newCall方法创建一个Call对象,同时调用execute方法,返回服务器的数据,即Response对象
Response response = client.newCall(request).execute()
4.获取Response返回的数据
response.body().string();
okhttp3.Callback callback;
OkHttpClient okHttpClient=new OkHttpClient();
Request request=new Request.Builder().url(urlAdress).build();
okHttpClient.newCall(request).enqueue(callback);
callback为传入的回调函数地址,使用实现匿名接口的形式new new Callback(){
}.......
异步发起的请求会被加入到 Dispatcher 中的 runningAsyncCalls双端队列中通过线程池来执行。
1.获取Response数据
..........
String string=response.body().string();
2.定义JSONArray数组
JSONArray jsonArrayP=new JSONArray(response);
3.获取JSONObject对象
JSONObject jsonObject=jsonArrayP.getJSONObject(i);
4.取出相应数据
jsonObject.getString("name");
jsonObject.getxxxx(xxxx);
【开源网址】
https://github.com/google/gson
dependencies {
implementation 'com.google.code.gson:gson:2.8.5'
}
class MyThread extends Thread{
@Override
public void run() {
super.run();
}
}
void test(){
MyThread myThread=new MyThread();
myThread.start();
}
class MyThread implements Runnable{
@Override
public void run() {
}
}
void test(){
MyThread myThread=new MyThread();
new Thread(myThread).start();
//new Thread构造函数需要一个Runnable接口
new Thread(new Runnable() {
@Override
public void run() {
}
}).start();
//不用专门去定义一个类来实现Runnable接口
Message message=new Message();
message.arg1=1;
message.arg2=2;
message.what=3;
message.obj=null;//携带Object对象
Message message=new Message();
message.arg1=1;
message.arg2=2;
message.what=3;
message.obj=null;//携带Object对象
Handler handler=null;//测试
handler.sendMessage(message);
Handler handler= new Handler(){
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
}
};
AsyncTask是一个抽象类
-定义
public abstract class AsyncTask<Params, Progress, Result> {
...
}
// 类中参数为3种泛型类型
// 整体作用:控制AsyncTask子类执行线程任务时各个阶段的返回类型
// 具体说明:
// a. Params:开始异步任务执行时传入的参数类型,对应excute()中传递的参数
// b. Progress:异步任务执行过程中,返回下载进度值的类型
// c. Result:异步任务执行完成后,返回的结果类型,与doInBackground()的返回值类型保持一致
// 注:
// a. 使用时并不是所有类型都被使用
// b. 若无被使用,可用java.lang.Void类型代替
// c. 若有不同业务,需额外再写1个AsyncTask的子类
}
class DownLoad extends AsyncTask<Void,Integer,Boolean>{
protected void onPreExecute() {
super.onPreExecute();
}//后台任务执行之前调用
@Override
protected Boolean doInBackground(Void... voids) {
int download=0;
publishProgress(download);//向主线程反馈数据,很快调用onProgressUpdate()
return null;
}//所有代码都在子线程里进行,不能进行UI更新操作
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
}//可以操作UI
@Override
protected void onPostExecute(Boolean aBoolean) {
super.onPostExecute(aBoolean);
}//doInBackground后台任务执行完毕,aBoolean作为后台任务的返回值
}
//无需向后台任务传参数//整型作为进度显示//使用Boolean来反馈执行结果
new DownLoad().execute();//启动任务
class MyService extends Service{
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
}//创建服务调用.
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}//每次服务启动调用
@Override
public void onDestroy() {
super.onDestroy();
}//服务销毁的时候调用
}
服务必须注册
void test001(){
Intent intent=new Intent(this,MyService.class);
startService(intent);
}
void test001(){
Intent intent=new Intent(this,MyService.class);
stopService(intent);
}
只需要在MyService的任何一个位置调用stopSelf()即可停止服务
借助onBind()方法
class MyService extends Service{
//使用Binder类来管理后台任务
/**********************************/
class TestBinder extends Binder{
.........具体方法
}//继承自Binder类,Binder类实现了IBinder接口
/***********************************/
TestBinder testBinder=new TestBinder();
@Nullable
@Override
public IBinder onBind(Intent intent) {
//return null;
return testBinder;
}
........................................
}
第一阶段:
....................................................
public MyService.TestBinder testBinder=null;
private ServiceConnection serviceConnection=new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
testBinder=(MyService.TestBinder)iBinder;
//调用testBinder的各种方法
}
//参数里面的iBinder即为onBind()返回的对象
@Override
public void onServiceDisconnected(ComponentName componentName) {
}
};//ServiceConnection是接口
第二阶段:
................................
void test001(){
Intent intent=new Intent(this,MyService.class);
bindService(intent,serviceConnection,BIND_AUTO_CREATE);
//startService(intent);
//解除调用
unbindService(serviceConnection);
}
..................................
创建一个异步的、会自动停止的服务
class MyIntentService extends IntentService{
public MyIntentService(){
super("MyIntentService");
}//必须这样,因为抽象父类里面没有默认的构造函数
@Override
protected void onHandleIntent(@Nullable Intent intent) {
//处理具体的逻辑
startService(intent);
}
@Override
public void onDestroy() {
super.onDestroy();
}
}
通知可以在【活动】,【广播】,【服务】中创建。
NotificationManager notificationManager=(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
Notification notification=new NotificationCompat.Builder(this)
.setContentTitle("")
.setContentText("")
.setWhen(System.currentTimeMillis())
//通知被创建的时间,以毫秒为单位,System.currentTimeMillis()产生一个当前的毫秒,这个毫秒其实就是自1970年1月1日0时起的毫秒数
.setSmallIcon(R.drawable.ic_launcher_background)
//getResources()获取要加载的资源文件对象
.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.ic_launcher_background))
.setContentIntent(pi)
//设置当点击通知后的跳转
.setAutoCancel(true)
//设置点击了通知后,通知自动消失
.build();
注:java的连缀用法
在创建对象时,同时调用属性的设值函数,为属性赋值
Apple apple = new Apple()
.setColor("Green")
.setWeight(12.3f);
//但是函数必须返回this
notificationManager.notify(1,notification);
Intent intent=new Intent(this,WeatherActivity.class);
PendingIntent pendingIntent=PendingIntent.getActivity(this,0,intent,0);
............
.setContentIntent(pendingIntent)
................
.setAutoCancel(true)
...................
notificationManager.cancel(1);
.setSound(Uri.fromFile(new File("1233")))//加入声音
.setVibrate(new long[]{0,1000,1000,1000})//振动,毫秒单位,主要申请权限
.setLights(Color.BLUE,1000,1000)
......
.setStyle(new NotificationCompat.BigTextStyle().bigText("........"));
............
.setStyle(new NotificationCompat.BigPictureStyle().
bigPicture(BitmapFactory.decodeResource(getResources(),R.drawable.png01)))
.setPriority(NotificationCompat.PRIORITY_MAX)
跨进程通信
class MyBroadCast extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
//不允许开线程
}
}
.........................
IntentFilter intentFilter=new IntentFilter();
MyBroadCast myBroadCast=new MyBroadCast();
.....................
intentFilter.addCategory("android.net.conn.CONNECTIVITY_CHANGE");//网络状态发生变化
registerReceiver(myBroadCast,intentFilter);
...........................
unregisterReceiver(myBroadCast);
【拓展】
......................................................
ConnectivityManager connectivityManager=(ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
//ConnectivityManager管理网络连接
NetworkInfo networkInfo=connectivityManager.getActiveNetworkInfo();//注意申请权限
//获取网络信息
if(networkInfo!=null&&networkInfo.isAvailable()){//是否有网络
// ..........................;
}
..........................................................
<intent-filter>
<action android:name="com.example.action.MAIN" />
intent-filter>
Intent intent=new intent(com.example.action.MAIN);
sendBroadCast(intent);
Intent intent=new intent(com.example.action.MAIN);
sendOrderedBroadCast(intent);
注册的时候设置有序广播接收器的接受顺序
<intent-filter android:priority="100">
有序广播截断
class MyBroadCast extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
//不允许开线程
abortBroadcast();
}
}
使用LocalBroadcastManage
①注册
intentFilter.addCategory("android.net.conn.CONNECTIVITY_CHANGE");
MyBroadCast myBroadCast=new MyBroadCast();
LocalBroadcastManager localBroadcastManager=LocalBroadcastManager.getInstance(getApplicationContext());
localBroadcastManager.registerReceiver(myBroadCast,intentFilter);
②发送
Intent intent=new intent(com.example.action.MAIN);
localBroadcastManager.sendBroadCast(intent);
③注销
localBroadcastManager.unregisterReceiver(myBroadCast);
不同的应用程序之间共享数据
if(ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.CALL_PHONE)!=
PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(MainActivity.this,new String[]{Manifest.permission.CALL_PHONE}
,1);//请求码是唯一值
}
.................
调用回调函数
onRequestPermissionsResult(requestcode,String[]permission,int[]grantResults){
.......
grantResults[0]==PackageManager.PERMISSION_GRANTED;
};
ContentResolver contentResolver=MainActivity.this.getContentResolver();
CRUD操作
contentResolver.insert();
contentResolver.update();
contentResolver.delete();
contentResolver.query();
//接受参数
内容URI:authority:com.example.provider和path:/table1
格式
content://com.example.provider/table1
解析成Uri对象
String string="content://com.example.provider/table1";
Uri uri=Uri.parse(string);
Cursor cursor=contentResolver.query();
if(cursor!=null)
while(cursor.moveToNext())
{ ........................................................
String string= cursor.getString(cursor.getColumnIndex("example"));
int i=cursor.getInt(cursor.getColumnIndex(int));
......................................................}
ContentValues contentValues=new ContentValues();
contentValues.put("column1","text");
contentValues.put("column2",2);
contentResolver.insert(Uri,contentValues);
ContentValues contentValues=new ContentValues();
contentValues.put("column1","text");
contentValues.put("column1",2);//changed
contentResolver.insert(Uri,contentValues,"column1=? and ....",new String[]{string...});
ContentValues contentValues=new ContentValues();
contentValues.put("column1","text");
contentValues.put("column1",2);//changed
contentResolver.delete(Uri"column1=? and ....",new String[]{string...});