Android所有应用组件必须包含其无参构造函数
ContentProvider:内容提供者,可以实现本应用中所有数据对外共享,可以个、跨进程访问资源
它的生命周期是由底层系统管理的
创建两个项目,他两的包名一样,两个对钩都选
构建:
1.直接或间接的继承ContentProvider
2.注册(在清单文件中进行声明)新建Activity的话会自动创建,要是class的话的自己手动创建
3.注册时同时对外提供一个URI通偶一 资源标识
对象的访问:
1.获得contentProvider对象的访问
2.通过ContentResolver对象,并借助ContentProvider
拿对象
获得对象
String ur=“content://复制清单”,content表示为协议,固定形式
Uri uri=uri.parse(ur)
执行insert方法
打印log
先运行service,然后在运行另一个,service只需启动一次
图片路径会方法data下面的媒体下面
获得图片:getcontentResolver
ur.query(uri,
查询那一列
where条件
。。。
。。。
删除了以后要去sd卡上面进行扫描
数据绑定用bindView,访问内存,改为true和尺寸大小
-----------------------------------------------------------------------------------------------------
cursor=cr.query(Media.EXTERNAL_CONTENT_URI, null, Media.IS_MUSIC+"=?", new String[] {"1"}, null);
第一个参数:表示一个标识符
第二个参数:表示按什么查询
第三个参数:查询的是否为音频?与下一个参数有关
第四个参数:1表示是否为音乐的格式,因为音频格式很多, 如果是0的话则不止是音乐
第五个参数:表示查询到以后按什么格式排序
this传数据不是很好所以用getApplicationContext()
---------------------------------------------------------------------
异步取音频:
创建一个Music的class
接口的使用:
定义一个借口,其中写一个方法
定义一个属性为接口名的属性
写一个参数为接口名的方法,在方法里面写this.**=**
interface OnMusicPrepareListener{
void onPrepareFinish(Cursor c);
}
private OnMusicPrepareListener listener;
public void setOnMusicPrepareListener(OnMusicPrepareListener listener){
this.listener=listener;
}
--------------------------------------------------------------------------------------------------
音乐的播放:
lv的监听Item
定义一个MediaPlayer mPlayer属性
监听方法
判断if(mplayer==null)创建new MediaPlayer,else重置reset()
Cursor c=(Cursor) adapter.getItem(position);获得点击位置
String path=c.getString(c.getColumnIndex(Media.DATA));得到那个位置的歌曲路径
mPlayer.setDataSource(path);设置路径,异常处理
prepar()启动异步任务,或者prepareAsync()需要接口,在里面启动
start,启动
onDestroy()释放资源if(mPlayer!=null){mPlayer.release();释放,mPlayer=null;设置为空}
setOncomplettion是一接口,表示播放完了之后的操作:可以在其中设置继续播放....
--------------------------------------------------------
CursorLoader:访问联系人信息
find
创建适配器,设置为全局
关联适配器setAdapter
设置权限:<uses-permission android:name="android.permission.READ_CONTACTS"/>
设置API为11
getContentResolver().query(Phone.CONTENT_URI, null, null, null, null);得到一个Cursor,设置了下面就可以为null
创建LoaderManager对象
并启动initLoader(0, null, this);
initloader启动 1.传一id 2.需要传参数 3.要实现LoaderCallbacks<Cursor>
实现了之后又3个方法
onCreadrLoader 它的参数与第一个对应,然后实现三个方法
这三个都在主线程工作,当newLoaderManager时底层会执行异步处理,
1.onCreateLoader:在初值化Loader时执行;中if(id==0)new一个CorsorLoader(this,uri,null,null,null,null)
返回cLoader
2.onLoadFinished:数据加载完成执行:adaper.ch(data)
3.OnLoaderReset:activity销毁或Loader重置时会执行;adaper.changeCursor(null)
----------------------------------------------------------------------------------------------------------
========================================================================================================
Service:
自带一个onBind方法:此方法在启动模式没用,应用于绑定模式
两个button,启动和停止
创建在Ctrl+N中的Object中的service
创建三个方法:
onCreate()service创建时
onStartCommand()service每次启动都会执行
onDestroy()service结束时
onStartCommand()的三个参数:
1.intent:意图对象,可以封装数据,启动时传过来
2.flags:表示intent对象的一种启动方式
3.startId:表示每启动一次都会+1,表示哪一次请求
返回值为:STAET_STICKY表示service的粘性(意思是表示非正常kill了还会启动,只有正常stop才不会重启)
START_STICKY_COMPATIBILITY此值为START_STICKY的兼容模式,表示serviec被非正常kill时,不保证会重启
START_NOT_STICKY:表示被非正常kill后不会重启
START_REDELIVER_INTENT:表示被非正常kill之后,还会自动启动,启动之后会执行本方法,id会从0开始
在Main中的button中
startService(new Intent(this,MyService.class));
stopService(new Intent(this,MyService.class));
-------------------------------------------------------------------------------------
oncrete启动yinyue
onstart中得到
------------
继承IntentService,
创建一个Service并且构建一个有参的构造方法,然后把类名传过去
重写一个onHandLeIntent 它运行在工作线程,此方法为回调方法,它的底层会创建Handler,所以会自动
main中
--------------------------------------------------------------------------------------------------
绑定service
getsimp得到类名
执行步骤:绑定1.onCreate 2.onBind 3.onServiceconnected
解绑 1.onUnbind 2.onDestroy
main中 private ServiceConnection con = new ServiceConnection()然后中有两个方法
onServiceDisconnected:非正常解除绑定以后会执行此方法
onServiceConnected 绑定成功后执行此方法
两个button上面写启动bindservice和unbing
bindService(new Intent(this,MyService.class), conn,Context.BIND_AUTO_CREATE)
unbindService(conn)
myservice中 三个方法1.onCreate()2.onUnbind3.onDestroy()
可以创建一个class,来把service传过去
点击绑定了会执行三个1.oncreate 2.onBind 3.onServiceconnected 再点击绑定没有效果,所以只能绑定一次
点击解除绑定也只能点击一次,再点击则会崩掉
--------------------------------------
混合service
执行的顺序为:先绑定service:1.onCreate 2.onBind 3.onServiceConnected
再启动service:1.onStartCommand 2. 3.
停止service:1. 2. 3.
解除service:1.onUnbind 2.onDestroy 3.
在onDestroy中解除绑定,意思是如果没有解绑按了返回键,则会报错,并强制解绑
--------------------------------------------------------------------------
写一个class继承IntentService此方法在工作线程中进行,里面有个onHandlerIntent方法重写,还有一个构造方法
记得要在清单列表中注册service
======================================================================
广播broadCastReceiver
静态注册方式的广播接收者对象执行完此方法会自动销毁
普通广播:
在清单文件里面设置 <intent-filter ><action 和权限<uses-permission然后启动程序再重启虚拟机
静态广播接收每次都会执行 构造方法和onReceive
intent("","权限名")
动态广播在class里面写注册广播 ,则一定要在销毁activity时解除注册onDestroy
构造方法只运行一次,onReceive每次都运行
intent("","权限名")
LocalBroadcastManager本地广播,只能在本app里面访问,使用LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast
来发送广播
------------------------------
有序广播:
设置优先级:android:priority="300",最大优先级为1000最低为-1000
发送广播用sendOrderedBroadcast(new Intent("action.tarena"),"action.yjq");第一个参数为清单文件下面的名,第二个是上面的的名,如果为
动态广播时,则不需要在清单文件里面写以上
有序广播里面有一个get||setResult的方法,可以在不同广播中得到数据,这个方法也可以设置了权限以后,得到打电话前缀
--------------
注意:
1.跟新UI只能在主线程内执行,所以一系列都在主线程里面执行,音乐播放器的那个方法时在主线程里面执行的
先绑定在启动,一般是在绑定的方法里面绑定,在onClick里面绑定,然后下载完成后销毁service,用一个弱引用调用外界的MainActivity
2.设置权限格式为包名.类名
------------------