广播broadcast
查看全部
0
采集
收起
2019-02-09
点击事件
case R.id.bind://绑定服务
intent2=new Intent(MainActivity.this,MyBindService.class);
startService(intent2);//StartService 和 BindService相结合实现服务(要在onDestroy销毁),去掉就是单独的BinderService。
bindService(intent2, connection, BIND_AUTO_CREATE);//第二个参数是连接对象,第三个参数是必须要填的一个常量,没写的话将无法自动创建Service。
break;
case R.id.Unbind:// 解绑服务
unbindService(connection);
break;
单纯使用 BindService还是有很多隐患的。实际上可以结合 StartService 和 BindService。如图,使用同一个通信 intent2 ,就可以实现。
但比较麻烦的是,你打开了服务,就要相应地去关闭服务,所以要在 MainActivity 中重写 onDestroy()方法:
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
stopService(intent2);
unbindService(connection);//解绑
super.onDestroy();
}
这样在 Activity 被销毁的时候,就会停止服务,并解除了绑定。这样一来,即使程序被强制退出,也不会报错(之前会报一些和Service相关的错)。
注意:解绑只能使用一次,多次使用会报错,另外当启动源在没有解绑的情况下退出程序也会报错。
摘自评论区:
bindService();方法中的第二个参数必须实现,ServiceConnection conn = new ServiceConnection(){};里边有两个方法可以暂时不管。如果写成null是会报错的。
查看全部
1
采集
收起
2019-01-25
SQLite是用C语言编写的开源嵌入式数据库引擎。它支持大多数的SQL92标准,并且可以在所有主要的操作系统上运行。
SQLite:轻量级、性能不错,管理成本小。在管理、维护方面都非常出色,功能强大。
——支持高达2TB大小的数据库
——以单个文件的形式存在
——以B-Tree的数据结构形式存储在磁盘
特点主要包括:
1.轻量级:一个动态库、单文件
2.独立性:没有依赖,无需安装
3.隔离性:全部在一个文件夹中
4.跨平台:支持众多操作系统
5.多语言接口:支持众多编程语言
6.安全性:事务(在下面细说)
关于事务处理的安全性问题:
---通过数据库的排它锁和共享锁来实现独立的事务处理
---多个进程可以在同一时间内从同一个数据库读取数据,但只有一个可以写入数据(保证数据的一致性,但也牺牲了效率)
基本满足移动的、嵌入设备的开发。
--------------------
SQLite支持的数据类型:
NULL、INTEGER、REAL、TEXT、BLOB。分别表示 空值、整型、浮点型、字符串型、二进制对象。
有意思的是,它既然支持多种编程语言,但有的语言是没有像REAl或者BLOB这样的数据类型,要怎么解决呢?那就是采用“弱引用”,也叫动态数据类型。
动态数据类型(弱引用):
---当某个值插入到数据库时,SQLite将会检查它的类型,如果该类型与关联的列不匹配,SQLite则会尝试将该值转换成该列的类型,如果不能转换,则该值将作为本身的类型存储。
但最好不要使用不支持的类型。
-----------------------
使用须知:
---由于资源占有少、性能良好和零管理成本,嵌入式数据库有了它的用武之地。例如Android、IOS。
---没有可用于 SQLite 的网络服务器、只能通过网络共享,可能存在文件锁定(Windows)或者性能问题。
---只提供数据库级的锁定。
---没有用户账户的概念,而是根据文件系统确定所有数据库的权限。
查看全部
//创建一个类继承SQLiteOpenHelper,并重写onCreate,onUpgrade方法
查看全部
//SharedPerferences存取数据
//mysps:存储的xml文件名,MODE_PRIVATE:当前程序可读
SharedPerferences sps = getSharedPerferences("mysps","MODE_PRIVATE");
//通过edit()方法获得一个编辑器对象
Editor editor = sps.edit();
//用编辑器对象调用putxxx方法存入简单数据key-valus
editor.putInt("age",20);
//最后都需要写个提交才能存储完成
editor.commit();
查看全部
SystemService
1. 使用LayoutInflater把一个layout转换成view
LayoutInflater inflater = (LayoutInflater) MainActivity.this.getSystemService(LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.activity_main, null);
setContentView(view);
查看全部
给gestureOverlayView设置监听器:
gestureOverlayView.addOnGesturePerformedListener(new OnGesturePerformedListener(){})
重写方法onGesturePerformed()。
如图,onGesturePerformed()的示例代码,也就是关于手势识别的代码实现。
ArrayList:预测集
查看全部
当应用程序在安装时,系统就会分配给他一个userid,当该应用要去访问其他资源比如文件的时候,就需要userid匹配。默认情况下,任何应用创建的文件,sharedpreferences,数据库应该都是私有的(位于/data/data//files),其他程序无法访问。除非在创建时指定了MODE_WORLD_READABLE 或者 MODE_WORLD_WRITEABLE。
创建的文件保存在/data/data//files目录
openFileOutput(fileName,MODE):第一个参数是文件的名字,第二个参数是权限,权限可
查看全部
0
采集
收起
2018-11-16
代码实现
1. 首先是创建数据库,和上一节课一样:
SQLiteDatabase db = openOrCreateDatabase("stu.db",MODE_PRIVATE,null);
2. 然后是创建表格,和上一节一样:
db.execSQL("create table if not exists stutb (_id integer primary key autoincrement, name text not null, sex text not null, age integer not null )");
查看全部
button中设置android:onClick="doClick"
String name=pref.getString("username","" );
if (name==null) {
checkBox1.setChecked(false);
}else {
checkBox1.setChecked(true);
查看全部
0
采集
收起
2018-11-16
广播优先级别
android:priority="1000">//值为-1000~1000
abortBroadcast();//截断广播的方法
/**
* 动态注册广播接收器*/
查看全部
0
采集
收起
2018-11-16
通过execSQL进行数据操作(比较复杂,不建议使用)
// 打开或创建(如果有就打开,没有就创建,没有“覆盖”的问题)一个数据库
SQLiteDatabase db = openOrCreateDatabase("user.db",MODE_PRIVATE,null);// 数据库名,权限,游标(不需要)
//创建表(usertb),创建主键(_id),创建列(name,age,sex
db.execSQL("create table if not exists usertb (_id integer primary key autoincrement, name text not null, age integer not null, sex text not null)";);
db.execSQL("insert into usertb (name,age,sex) values('张三','男',20)";);//查询语句
Cursor cursor = db.rawQuery("select * from usertb",null); // 查询数据,以游标形式,第二个参数代表条件
if (cursor!=null){
//表示查询成功
while(cursor.moveToNext()){
Log.i("info","_id"+cursor.getInt(cursor.getColumnIndex("_id")));// 先获得列的编号,再通过编号获得对应的值。
Log.i("info","name="+cursor.getString(cursor.getColumnIndex("name")));
Log.i("info","sex="+cursor.getString(cursor.getColumnIndex("sex")));
Log.i("info","age="+cursor.getInt(cursor.getColumnIndex("age")));
}
cursor.close(); // 释放资源
}
db.close(); // 关闭数据,释放内存
查看全部
SQLite中的Cursor的作用和使用
查看全部
“SQLite”数据库的使用 一
/*
* @param myDB.db 数据库的名字,最好以".db"结尾,这样导出到外部的时候不需要再转格式
* @param MODE_PREIVATE 设置模式,有私有(只能改应用程序访问),只读,读写等。
* @param CursorFactory 游标工厂。 暂时不知道干什么的,给空即可。
* */
SQLiteDatabase sqLiteDatabase= openOrCreateDatabase("myDB.db", MODE_PRIVATE, null);//打开或者创建数据库
/*
* 执行sql语句
* 创建数据库表,使用 create table if not exists tablename 的形式,判断表是否存在,如果存在,则不创建
* 注意:主键建议使用"_"开头,如"_id",因为在以后的ListView开发中,貌似只能识别"_"开头的主键
* */
sqLiteDatabase.execSQL("create table if not exists User(_id integer primary key autoincrement, name text)");//执行sql语句
/*
* 插入数据,必须加into,否则报错
* */
sqLiteDatabase.execSQL("insert into User (name) values('张三')");
查看全部
SQLite特点主要包括:
1、轻量级 一个动态库、单文件
2、独立性 没有依赖、无须安装
3、隔离性 全部在一个文件夹中
4、跨平台 支持众多操作系统
5、多语言接口 支持众多编程语言
6、安全性 事务
--关于事务处理的安全性:
-通过数据库上的独占性和共享锁来实现独立事务处理
-多个进程可以同一时间从同一个数据库读取数据,但只有一个可以写入数据。
SQLite的数据类型:
-SQLite支持NULL、INTEGER、REAL、TEXT、BLOB数据类型
-依次代表:空值、整型值,浮点值,字符串值,二进制对象
动态数据类型(弱引用)
-当某个值插入到数据库时,SQLite会检查他的数据类型,如果该类型与关联的列类型不匹配,SQLite就会尝试将该值转换成该列的类型,如果不能转换,该值将作为本身的类型存储。
使用须知:
-由于资源占用少、性能良好和零管理成本,嵌入式数据库有了他的用武之地。例如Android、IOS
-没有可用于SQLite的网络服务器、只能通过网络共享可能存在文件锁定或者性能问题。
-只提供数据库级的锁定。
-没有用户账户概念,而是根据文件系统确定所有数据库的权限
查看全部
SharedPreferences适合存一些简单的数据,是一种轻量的存储方式
int string bool它的本质是基于xml文件存储key_value键值对的存储
通常用来存储一些简单的配置信息
查看全部
服务类型:
用于应用内部:本地服务
startservice stopservice stopself stopselfresult
bindservice unbindservice
android系统内部应用程序之间 :远程服务
查看全部
0
采集
收起
2018-09-29
通过 SharedPreferences.getXXX("KEY","") 获得对应Editor.putXXX("KEY","")保存的值
查看全部
实现SharedPreferences存储步骤:
1.获得SharedPreferences对象
SharedPreferences pref=PreferenceManager.getDefaultSharedPreferences(MainActivity.this);
或
SharedPreferences pref=getSharedPreferences("myPref",Mode_PRIVATE);
2.获得SharedPrederences.Editor对象
Editor editor=pred.edit();
3.通过Editor接口的putXxx方法保存key-value对其中Xxx表示不同的数据类型
editor.putString("name","张三");
editor.putInt("age",30);
editor.putLong("time",System,currentTimeMillis());
editor.putBoolean("default",true);
4.通过Editor接口的commit方法保存key-value对
editor.commit();
笔记附录:
1.附加代码:editor.remove(key);
2.取值:
pref.getString("name","");
pref.getInt("age",0);
查看全部
onBind中通过MyBinder返回当前服务对象
查看全部
0
采集
收起
2018-08-30
绑定式的服务跟启动源绑定在了一起,启动源Activity销毀前必须先解绑,不然会报错
查看全部
0
采集
收起
2018-08-30
this.getExternalFilesDir()获取外部存储位置跟内置的使用时一样的
查看全部
https://blog.csdn.net/u013365671/article/details/40678867
查看全部
0
采集
收起
2018-08-22
this.getFilesDir 当前应用默认的数据存储目录
查看全部
Broadcast(广播)
BroadcastReceiver-组件(广播接收器)
查看全部
0
采集
收起
2018-08-07