志达IT
做快乐程序员

android的四大组件(android的数据存储方式)

android的四大组件

Android四大组件分别为activity、service、contentprovider、broadcastreceiver。
一、android四大组件详解
1、activity
Activity能够看成是安卓体系的根本,在这个根本上才能够进行其他的作业,由于在安卓体系里运转的一切的程序,它的流程都有必要在【Activity】中运转,一切他是最根本的模块。它的效果是一个结构或页面,每个程序会有多个【Activity】组成。
(1)一个Activity通常便是一个独自的屏幕(窗口)。
(2)Activity之间经过Intent进行通讯。
(3)android运用中每一个Activity都有必要要在AndroidManifest.xml装备文件中声明,否则体系将不识别也不履行该Activity。android
2、service
Service是安卓里非常很重要的组件,它的地位和优先级别是与活动类似的,不过Service不能够自己运转,它只能在安卓的后台运转。它的效果便是与安卓的其他逐渐进行交互,举个简略比如:当我们翻开手机上音乐播映器并将它放到后台,此时播映的音乐便是由Service在负责控制。
1)service用于在后台完结用户指定的操作。service分为两种:
started(发动):当运用程序组件(如activity)调用startService()办法发动服务时,服务处于started状况。
bound(绑定):当运用程序组件调用bindService()办法绑定到服务时,服务处于bound状况。
2)startService()与bindService()差异:
startedservice(发动服务)是由其他组件调用startService()办法发动的,这导致服务的onStartCommand()办法被调用。当服务是started状况时,其生命周期与发动它的组件无关,而且能够在后台无限期运转,即便发动服务的组件现已被毁掉。因而,服务需求在完结使命后调用stopSelf()办法中止,或许由其他组件调用stopService()办法中止。
运用bindService()办法启用服务,调用者与服务绑定在了一同,调用者一旦退出,服务也就停止,大有“不求一起生,有必要一起死”的特色。
3)开发人员需求在运用程序装备文件中声明全部的service,运用标签。
4)Service通常坐落后台运转,它一般不需求与用户交互,因而Service组件没有图形用户界面。Service组件需求继承Service基类。Service组件通常用于为其他组件供给后台服务或监控其他组件的运转状况。
3、contentprovider(内容供给商)
内容供给商这个组件是专门为第三方运用而规划的,它非常的灵敏,而且相当重要,它会为一切的运用准备一个内容窗口,而且保留数据库、文件,效果便是我们在运用这些第三方软件的时分,能够有效的拜访,而且维护里面的数据。
1)android渠道供给了ContentProvider使一个运用程序的指定数据集供给给其他运用程序。其他运用能够经过ContentResolver类从该内容供给者中获取或存入数据。
2)只有需求在多个运用程序间同享数据是才需求内容供给者。例如,通讯录数据被多个运用程序运用,且有必要存储在一个内容供给者中。它的优点是统一数据拜访办法。
3)ContentProvider完成数据同享。ContentProvider用于保存和获取数据,并使其对一切运用程序可见。这是不同运用程序间同享数据的仅有办法,由于android没有供给一切运用一起拜访的公共存储区。
4)开发人员不会直接运用ContentProvider类的目标,大多数是经过ContentResolver目标完成对ContentProvider的操作。
5)ContentProvider运用URI来仅有标识其数据集,这里的URI以content://作为前缀,表示该数据由ContentProvider来办理。
4、broadcastreceiver(播送接纳器)
在安卓体系中,播送接纳器并不是直接就能够看到的,它是程序之间传递信息时的一种机制,效果便是接纳或许发送告诉。浅显的来说播送接纳器更像是一种传递组件,它能够将信息接纳,乃至还能够对它进行过滤然后进行呼应。
1)你的运用能够运用它对外部事情进行过滤,只对感兴趣的外部事情(如当电话呼入时,或许数据网络可用时)进行接纳并做出呼应。播送接纳器没有用户界面。但是,它们能够发动一个activity或serice来呼应它们收到的信息,或许用NotificationManager来告诉用户。告诉能够用很多种办法来招引用户的注意力,例如闪烁背灯、轰动、播映声响等。一般来说是在状况栏上放一个耐久的图标,用户能够翻开它并获取音讯。
2)播送接纳者的注册有两种办法,分别是程序动态注册和AndroidManifest文件中进行静态注册。
3)动态注册播送接纳器特色是当用来注册的Activity关掉后,播送也就失效了。静态注册无需忧虑播送接纳器是否被封闭,只需设备是开启状况,播送接纳器也是翻开着的。也便是说哪怕app自身未发动,该app订阅的播送在触发时也会对它起效果。
二、android四大组件总结:
1、4大组件的注册
4大根本组件都需求注册才能运用,每个Activity、service、ContentProvider都需求在AndroidManifest文件中进行装备。AndroidManifest文件中未进行声明的activity、服务以及内容供给者将不为体系所见,从而也就不可用。而broadcastreceiver播送接纳者的注册分静态注册(在AndroidManifest文件中进行装备)和经过代码动态创建并以调用Context.registerReceiver()的办法注册至体系。需求注意的是在AndroidManifest文件中进行装备的播送接纳者会随体系的发动而一向处于活跃状况,只需接纳到感兴趣的播送就会触发(即便程序未运转)。
2、4大组件的激活
内容供给者的激活:当接纳到ContentResolver发出的恳求后,内容供给者被激活。而其它三种组件activity、服务和播送接纳器被一种叫做intent的异步音讯所激活。
3、4大组件的封闭
内容供给者仅在呼应ContentResolver提出恳求的时分激活。而一个播送接纳器仅在呼应播送信息的时分激活。所以,没有必要去显式的封闭这些组件。Activity封闭:能够经过调用它的finish()办法来封闭一个activity。服务封闭:对于经过startService()办法发动的服务要调用Context.stopService()办法封闭服务,运用bindService()办法发动的服务要调用Contex.unbindService()办法封闭服务。
4、android中的使命(activity栈)
a)使命其实便是activity的栈,它由一个或多个Activity组成,一起完结一个完好的用户体验。栈底的是发动整个使命的Activity,栈顶的是当时运转的用户能够交互的Activity,当一个activity发动别的一个的时分,新的activity就被压入栈,并成为当时运转的activity。而前一个activity仍保持在栈之中。当用户按下BACK键的时分,当时activity出栈,而前一个恢复为当时运转的activity。栈中保存的其实是目标,栈中的Activity永远不会重排,只会压入或弹出。
b)使命中的一切activity是作为一个全体进行移动的。整个的使命(即activity栈)能够移到前台,或退至后台。
c)Android体系是一个多使命(Multi-Task)的操作体系,能够在用手机听音乐的一起,也履行其他多个程序。每多履行一个运用程序,就会多耗费一些体系内存,当一起履行的程序过多,或是封闭的程序没有正确释放掉内存,体系就会觉得越来越慢,乃至不稳定。为了处理这个问题,Android引入了一个新的机制,即生命周期(LifeCycle)。

android的数据存储方式

实践开发Android运用程序时,数据的存储与操作是必不可少的。在这里我首要介绍Android中完成数据存储的5种办法,分别是:
1、SharedPreferences存储数据
2、文件存储数据
3、SQLite数据库存储数据
4、ContentProvider存储数据
5、网络存储数据
一、文件存储
特色:openFileInput()和openFileOutput()读取设备上的文件。
长处:适用于存储很多的数据,能够存储图片、视频、文本等数据。
缺陷:假如选用内部存储的办法,存储过量的数据可能会导致内存的不足;假如选用外部sdcard存储的办法,删去或许卸载运用,相关的数据需要手动进行删去,比较麻烦。
默许方位:/data/data/<包>/files/.。
(一)内部存储
//将数据存储到指定的文件中
//name为文件名,mode为文件的操作形式
FileOutputStreamfos=openFileOutput(Stringname,intmode);
//读取指定文件中的数据
FileInputStreamfis=openFileInput(Stringname);
mode的取值如下:
MODE_PRIVATE:该文件只能被当前程序读写;
MODE_APPEND:该文件的内容能够追加;
MODE_WORLD_READABLE:该文件的内容能够被其他程序读;
MODE_WORLD_WRITEABLE:该文件的内容能够被其他程序写
留意:Android系统有一套自己的安全模型,默许情况下任何运用创立的文件都是私有的,其他程序无法拜访。
1.写入文件过程
StringfileName=“data.txt”;//文件称号
Stringcontent=“helloworld”;//保存数据
FileOutputStreamfos=openFileOutput(fileName,MODE_PRIVATE);
fos.write(content.getBytes());//将数据写入文件中
fos.close();//封闭输出流
2.读取文件过程
Stringcontent=“”;
FileInputStreamfis=null;
fis=openFileInput(“data.txt”);//获得文件输入流目标
byte[]buffer=newbyte[fis.available()];//创立缓冲区,并获取文件长度
fis.read(buffer);//将文件内容读取到buffer缓冲区
content=newString(buffer);//转换成字符串
fis.close();//封闭输入流
3.完成存储和读取用户名和密码实例
创立UserInfoIO东西类,完成存储数据办法(saveUserInfo)和读取数据办法(getUserInfo)
publicclassUserInfoIO{
//数据的写入
publicstaticbooleansaveUserInfo(Stringusername,Stringpassword,Contextcontext){
//openFileOutput(要操作的文件名,文件拜访形式)
FileOutputStreamfos=null;
Stringmsg=null;
try{//在操作文件的时分可能会报反常,需要进行捕获
fos=context.openFileOutput(“MyData.txt”,Context.MODE_PRIVATE);
msg=username+”:”+password;
//getBytes()将字符串转换为字节省
fos.write(msg.getBytes());
returntrue;
}catch(IOExceptione){
e.printStackTrace();
returnfalse;
}
finally{
try{
fos.close();//流是系统中的稀缺资源,在运用完后要及时封闭
}catch(IOExceptione){
e.printStackTrace();
}
}
}
//用户数据的读取
publicstaticMapgetUserInfo(Contextcontext){
//获取文件输入流
FileInputStreamfis=null;
try{
fis=context.openFileInput(“MyData.txt”);
byte[]buffer=newbyte[fis.available()];
fis.read(buffer);
//字节转换为字符串
Stringmsg=newString(buffer);
String[]userInfo=msg.split(“:”);
MapuserMap=newHashMap<>();
userMap.put(“username”,userInfo[0]);
userMap.put(“password”,userInfo[1]);
returnuserMap;
}catch(IOExceptione){
e.printStackTrace();
returnnull;
}
finally{
try{
fis.close();
}catch(IOExceptione){
e.printStackTrace();
}
}
}
}android
二、SharedPreferences存储
特色:以XML格式将数据存储到设备。
长处:简略、便利、轻量级、易了解。
缺陷:适用于存储少数的数据,而且数据的格式只能是根本的数据类型(int、float、long、boolean)、字符串类型(string),无法进行条件查询等操作。
SharedPreferences是一个轻量级的存储类,特别合适用于保存软件装备参数,其背面是用xml文件存放数据,文件存放在/data/data//shared_prefs目录下。
1.写入文件过程
SharedPreferences目标自身只能获取数据而不支持存储和修正,存储修正是经过Editor目标完成。
SharedPreferencessp=getSharedPreferences(“data”,MODE_PRIVATE);//获取
SharedPreferences目标
SharedPreferences.Editoreditor=sp.edit();//获取编辑器目标
editor.putString(“name”,“张三”);//存入String类型数据
editor.putInt(“age”,8);//存入int类型数据
editor.commit();//提交数据
2.读取文件过程
SharedPreferencessp=getSharedPreferences(“data”,MODE_PRIVATE);
Stringdata=sp.getString(“name”,“”);
3.删去文件中数据
editor.remove(“name”);//根据key删去数据
editor.clear();//删去一切数据
4.完成存储和读取用户名和密码实例
创立UserInfoSharePre东西类,完成存储数据办法(saveUserInfo)和读取数据办法(getUserInfo)
publicclassUserInfoSharedPre{
//用户数据的存储
publicstaticbooleansaveUserInfo(Stringusername,Stringpassword,Contextcontext){
//获取SharedPreferences目标,一起指定文件称号和拜访权限
SharedPreferencessp=context.getSharedPreferences(“MyData”,Context.MODE_PRIVATE);
//获取获取SharedPreferences的编辑器目标
SharedPreferences.Editoredit=sp.edit();
//经过编辑器进行数据的存储
edit.putString(“Uname”,username);
edit.putString(“Pwd”,password);
edit.commit();
returntrue;
}
//读取用户数据
publicstaticMapgetUserInfo(Contextcontext){
//获取SharedPreferences目标,一起指定文件称号和拜访权限
SharedPreferencessp=context.getSharedPreferences(“MyData”,Context.MODE_PRIVATE);
Stringusername=sp.getString(“Uname”,””);
Stringpassword=sp.getString(“Pwd”,””);
MapuserMap=newHashMap<>();
userMap.put(“username”,username);
userMap.put(“password”,password);
returnuserMap;
}
}
三、SQLite数据库存储
特色:运算速度快,占用资源少,还支持根本SQL语法。
长处:合适存储结构化数据、轻量级、安全性、隔离性、独立性。
缺陷:并发的读写性能不好。
1.创立数据库过程
(一)界说数据库协助类
SQLiteOpenHelper是SQLiteDatabase的一个协助类,用来管理数据库的创立和版本的更新
classMyDbHelperextendsSQLiteOpenHelper{
//构造器的效果:(参数:上下文,数据库文件的称号,成果集工厂,版本号)界说数据库
publicMyDbHelper(@NullableContextcontext,@NullableStringname,@NullableSQLiteDatabase.CursorFactoryfactory,intversion){
super(context,name,factory,version);
}
//数据库初始化时创立的表,用于创立表或视图文件
@Override
publicvoidonCreate(SQLiteDatabasesqLiteDatabase){
sqLiteDatabase.execSQL(“createtableuser(user_idintegerprimarykeyautoincrement,userNamevarchar(10),passwordvarchar(10))”);
}
//晋级办法(当数据库的版本号增加时调用)
@Override
publicvoidonUpgrade(SQLiteDatabasesqLiteDatabase,inti,inti1){
}
}
(二)创立数据库和表
//设置数据库的相关参数,初始化数据库
MyDbHelpermyDbHelper=newMyDbHelper(SQLiteActivity.this,”MyDatabase.db”,null,1);
//经过协助类获取到数据库目标
SQLiteDatabasedb=myDbHelper.getWritableDatabase();
经过数据库目标能够履行如下办法:
1.刺进办法insert
//创立ContentValues目标用于存储记载的字段值(键值对办法:键对应字段名,值对应字段详细的值)
ContentValuescontentValues=newContentValues();
contentValues.put(“userName”,”张三”);
contentValues.put(“password”,”123456″);
db.insert(“user”,null,contentValues);
上面等同于
db.execSQL(“insertintouser(userName,password)values(?,?)”,newObject[]{“张三”,”123456″});
履行完之后
db.close();
2.查询办法query
调用query办法查询数据库中的数据,回来一个行数集合cursor
publicCursorquery(Stringtable,String[]columns,Stringselection,String[]selectionArgs,StringgroupBy,Stringhaving,StringorderBy,Stringlimit)
各参数说明:
各参数说明:
table:表称号
colums:列称号数组,回来那些字段,null表明一切字段
selection:查询条件子句,相当于select句子where要害字后面的部分,在条件子句允许运用占位符“?”selectionArgs:对应于selection句子中占位符的值,值在数组中的方位与占位符在句子中的方位有必要一致,否则就会有反常。
groupBy:相当于select句子groupby要害字后面的部分
having:相当于select句子having要害字后面的部分
orderBy:排序类
limit:分页查询的约束,指定偏移量和获取的记载数
Cursor:回来值,相当于成果集ResultSet
//Cursor:成果集,内有游标指向成果集中的某一条记载,初始时指向第一条
Cursorcursor=db.query(“user”,newString[]{“userName,password”},null,null,null,null,null,null);
cursor.moveToFirst();
while(cursor.moveToNext()){//移动游标指向下一行数据
showInfo.append(“\n”+”用户名”+cursor.getString(0)+”,密码”+cursor.getString(1));
}
cursor.close();
db.close();
3.删去办法delete
回来删去的记载条数
publicbooleandeleteData(StringdeleteId){
inti=db.delete(“user”,”id=?”,newString[]{deleteId});
returni>0?true:false;
}
4.修正办法update
回来更新的记载条数
ContentValuescontentValues=newContentValues();
contentValues.put(“userName”,”李四”);
contentValues.put(“password”,”123123″);
inti=db.update(“user”,contentValues,”id=?”,newString[]{updateId});
等同于
db.execSQL(“updateusersetuserName=?,password=?whereid=?”,newObject[]{username1,password1,id});
四、ContentProvider存储
特色:ContentProvider首要用于不同运用程序之间同享数据,ContentProvider更好的供给了数据同享接口的统一性,使不同运用同享数据更规范和安全。
长处:能够完成一切运用程序同享的一种数据存储办法,能够存储音频,视频,图片和通讯录等。
缺陷:不能单独运用,有必要与其他存储办法结合运用。
内容供给者(ContentProvider)是Android系统四大组件之一,它是不同运用程序之间进行数据同享的规范API,经过ContentResolver类能够拜访ContentProvider中同享的数据。
常见的运用场景:QQ和微信中文件的彼此转发;安装完某个app第一次发动的时分获取权限(联系人、拍照、方位等)
ContentProvider运用基于数据库模型的简略表格来供给需要同享的数据,在该表格中,每一行表明一条记载,而每一列代表特定类型和意义的数据,而且其间每一条数据记载都包括一个名为“_ID”的字段类标识每条数据,能够根据同一个ID查询几个相关表中的信息。知道各个字段对应的数据类型后,可根据Cursor目标供给的相关的办法,如,getInt()、getString()、getLong()等查询字段对应的值。
简略了解:A程序同享数据实践上就是同享一张表,B程序要去获取数据实践上就是要去对表履行查询操作。
问题:B程序怎么精确地找到A程序所同享出来的表?
ContentResolver供给一系列增修改查的办法对数据进行操作,而且这些办法以Uri的形式对外供给数据。
Uri为内容供给者中的数据建立了唯一标识符。它首要由三部分组成,scheme、authorities(主机名/域名)和path。
扩展:uri与url功用类似,经过uri能够指向安卓系统中唯一的某个资源。也就是说经过它能够指向同享出来的唯一的某个表文件
scheme部分,“content://”是一个规范的前缀。
authority(主机名/域名)部分,是在创立内容供给者时指定的authorities特色值,一般选用程序包名的办法命名。
path部分,“/person”代表资源(或许数据),能够动态改动。
UriMatcher类:用于对ContentProvider中的Uri进行匹配
1、初始化UriMatcher
UriMatchermatcher=newUriMatcher(UriMatcher.NO_MATCH);
//常量UriMatcher.NO_MATCH表明不匹配任何途径的回来码(-1)
2、将Uri注册到UriMatcher中
matcher.addURI(“cn.itcast.contentprovider”,”people”,1);
//增加需要匹配uri,假如匹配就会回来匹配码”1″
matcher.addURI(“cn.itcast.contentprovider”,”person/#”,2);
//#表明通配符,恣意内容的意思
1.创立数据库与表供给数据
publicclassMyDBhelperextendsSQLiteOpenHelper{
publicMyDBhelper(Contextcontext){
super(context,”person.db”,null,1);
}
@Override
publicvoidonCreate(SQLiteDatabasesqLiteDatabase){
sqLiteDatabase.execSQL(“createtableuser(idintegerprimarykeyautoincrement,userNamevarchar(10),phonevarchar(10))”);
}
@Override
publicvoidonUpgrade(SQLiteDatabasesqLiteDatabase,inti,inti1){
}
}
2.创立内容供给者承继ContentProvider父类
在程序包名处右击选择【New】—>【Other】—>【ContentProvider】选项
输入内容供给者的ClassName(类称号)和URIAuthorities(唯一标识,一般运用包名)
内容供给者创立完成后,AndroidStudio会自动在AndroidManifest.xml中对内容供给者进行注册。
……
android:name=”.MyContentProvider”
android:authorities=”cn.com.myapp”
android:enabled=”true”
android:exported=”true”>
特色意义如下:
(1)android:name:该特色是一个类的全称号
(2)android:authorities:列出一个或许多个由contentprovider的供给的URI的authorities,多个authorities由分号离隔(自界说)。
(3)android:enabled:该特色表明了该contentprovider是否能够被实例化,默许情况下该特色值是true。
(4)android:exported:该特色指示了contentprovider是否能够被其他运用程序运用。
publicclassMyContentProviderextendsContentProvider{
privatestaticUriMatcheruriMatcher=newUriMatcher(UriMatcher.NO_MATCH);
privatestaticfinalintSUCCESS=1;
privateMyDBhelpermyDBhelper;
//静态代码块,MyContentProvider目标没有创立出来之前就已经存在
static{
//加载时为uri适配器增加匹配规则
uriMatcher.addURI(“cn.com.myapp”,”user”,SUCCESS);
//查询表中的某条记载
uriMatcher.addURI(“cn.com.myapp”,”user/#”,2);
}
publicMyContentProvider(){
}
@Override
publicintdelete(Uriuri,Stringselection,String[]selectionArgs){
//Implementthistohandlerequeststodeleteoneormorerows.
thrownewUnsupportedOperationException(“Notyetimplemented”);
}
@Override
publicStringgetType(Uriuri){
//TODO:ImplementthistohandlerequestsfortheMIMEtypeofthedata
//atthegivenURI.
thrownewUnsupportedOperationException(“Notyetimplemented”);
}
@Override
publicUriinsert(Uriuri,ContentValuesvalues){
//TODO:Implementthistohandlerequeststoinsertanewrow.
thrownewUnsupportedOperationException(“Notyetimplemented”);
}
@Override
publicbooleanonCreate(){
//创立数据库和初始化表的内容
myDBhelper=newMyDBhelper(getContext());
returnfalse;
}
@Override
//未来会有别的一个app经过uri来调用query办法
publicCursorquery(Uriuri,String[]projection,Stringselection,
String[]selectionArgs,StringsortOrder){
//TODO:Implementthistohandlequeryrequestsfromclients.
//匹配传入的uri,假如匹配得上再做相应的查询
intmatch=uriMatcher.match(uri);
if(match==1){
//查询user表中的数据并回来
SQLiteDatabasedb=myDBhelper.getWritableDatabase();
returndb.query(“user”,projection,selection,selectionArgs,null,null,sortOrder);
}elseif(match==2){
//查询表中的某条记载
}else{
returnnull;
}
}
@Override
publicintupdate(Uriuri,ContentValuesvalues,Stringselection,
String[]selectionArgs){
//TODO:Implementthistohandlerequeststoupdateoneormorerows.
thrownewUnsupportedOperationException(“Notyetimplemented”);
}
}
3.在第一个app的Activity中给数据库增加数据
publicclassfirstApplicationActivityextendsAppCompatActivity{
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_first_application);
MyDBhelpermyDBhelper=newMyDBhelper(firstApplicationActivity.this);
SQLiteDatabasedb=myDBhelper.getWritableDatabase();
db.execSQL(“insertintouser(userName,phone)values(‘tom’,’8888′)”);
db.execSQL(“insertintouser(userName,phone)values(‘jeny’,’18888′)”);
db.execSQL(“insertintouser(userName,phone)values(‘jack’,’38888′)”);
}
}
4.创立第二个App作为拜访者
布局文件,经过点击按钮获取第一个app的数据用TextView展现出来
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=”.secondApplicationActivity”
android:orientation=”vertical”
>
android:id=”@+id/show”
android:layout_width=”match_parent”
android:layout_height=”0dp”
android:layout_weight=”9″/>
android:id=”@+id/btn”
android:layout_width=”match_parent”
android:layout_height=”0dp”
android:layout_weight=”1″
android:text=”获取同享数据”
/>
java文件
publicclasssecondApplicationActivityextendsAppCompatActivityimplementsView.OnClickListener{
privateButtonbtn;
privateTextViewtv_show;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second_application);
initViews();
setListener();
}
protectedvoidinitViews(){
btn=findViewById(R.id.btn);
tv_show=findViewById(R.id.show);
}
protectedvoidsetListener(){
btn.setOnClickListener(this);
}
@Override
publicvoidonClick(Viewview){
switch(view.getId()){
caseR.id.btn:
//创立uri,经过uri来指向同享的数据文件
Uriuri=Uri.parse(“content://cn.com.myapp/user”);
//获取拜访目标(内容解析者)
ContentResolvercontentResolver=getContentResolver();
Cursorcursor=contentResolver.query(uri,newString[]{“userName”,”phone”},null,null,null);
while(cursor.moveToNext()){
tv_show.append(“用户名:”+cursor.getString(0)+”—-:”+cursor.getString(1)+”\n”);
}
}
}
}
最终,两个app都发动,点击第二个app的按钮拿到了第一个app同享的值
五、网络存储
特色:经过网络上供给的存储空间来上传(存储)或下载(获取)我们存储在网络空间中的数据信息
长处:无需考虑内存的影响。
缺陷:受网络的状况的影响、需要消耗流量等成本。

赞(0)
未经允许不得转载:志达IT网站 » android的四大组件(android的数据存储方式)
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

志达IT网站 每天分享编程和互联网的IT技术博客

登录/注册联系我们