四大组件之其三



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.设置权限格式为包名.类名

------------------
















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值