首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > 移动开发 >

快讯应用总结

2012-09-01 
新闻应用总结1:新闻实现的主要功能2:新闻加载及更新3:进度条的实现4:后台播放新闻服务(Service和Broadcast

新闻应用总结
1:新闻实现的主要功能
2:新闻加载及更新
3:进度条的实现
4:后台播放新闻服务(Service和BroadcastReceiver的使用)
5:AIDL的使用

一:主要功能描述:
启动新闻后开始更新所有新闻,更新后系统会自动查找还没播放的新闻,并开始播放。新闻播放之前,播放按钮不显示。未播放过的新闻字体为白色,播放过的新闻为灰色。播放时,播放的当前行以进度条的形式显示播放进度,字体为白色。未播放行为字体为灰色,背景色为黑色和深灰色。未播放行只显示新闻标题,播放行必须显示一个播放Icon,新闻标题,当前播放时间和新闻更新时间。
单击前进播放按钮自动播放前一条新闻并刷新界面选中当前播放行,单击后退播放按钮自动播放后一条新闻并刷新界面选中当前播放行。单击暂停按钮则停止播放新闻, 所有的播放按钮处于不可见状态。
单击新闻时可以播放该行新闻,重新单击重新播放。
当有新闻在播放时,单击返回按钮后者其他类别选项时并不影响后台播放新闻的进度,新闻继续播放。
二:新闻加载及更新:
从网上下载最新新闻存入数据库,再将数据库中的新闻数据加载显示到UI界面上。
每隔一段时间,后台服务会自动更新新闻。实现方法是:外部(类与类之间)采用BroadcastReceiver 和  Service的结合使用,内部(类中)则才采用Handler与Message的结合使用。
三:进度条的实现:
Xml文件的实现:在styles.xml文件中定义ProgressBar的style类型(如minHeight,maxHeight,progressDrawable等参数)。其中progressDrawable的完整定义利用progress_bar.xml文件实现。Progress_bar.xml文件中主要定义ProgressBar的形状。然后在newslist_row.xml文件中定义ProgressBar视图组件。
Styles.xml:
<style name=”progressbar”>
<item name=“android:indeterminateOnly”>false</item>
<item name=”android:progressDrawable”>@drawable/progress_bar</item>
<item name=”android:indeterminateDrawable”>@null</item>
<item name=”android:minHeight”>72px</item>
<item name=”android:maxHeight”>72px</item>
</style>



Progress_bar.xml:
<?xml version=”1.0” encoding=”utf-8”?>
<layer-list xmlns:android=http://schemas.android.com/apk/res/android>
<item
android:id=”@android:id/background” android:drawable=”@drawable/list_gray” />
<item android:id=”@android:id/secondaryProgress”>
<clip>
<shape>
<corners android:radius=”5dip” />
<gradient
android:startColor=”#80ffd300”
android:centerColor=”#80ffb600”
android:centerY=”0.75”
android:endColor=”#a0ffcb00”
android:angle=”270” />
</shape>
</clip>
  </item>

  <item android:id=”@android:id/progress”>
<clip android:drawable=”@drawable/list_blue” >
</clip>
  </item>
</layer-list>

newslist_row.xml
<ProgressBar andorid:id=”@+id/progress_button”
andorid:layout_width=”540dip” android:layout_height=”wrap_content”
android:progressDrawable=”@+drawable/progress_bar”
style=”@+style/progressbar”
android:max=”100” android:progress=”1”
android:layout_alignParentLeft=”true”
android:layout_marginTop=”0px” />

Java文件的实现:采用Handler和Message每隔1000秒刷新一次进度条进度,直到下条新闻开始播放又重新开始刷新。
每次在bindView中调用doProgress(cur_number)方法:
private ProgressBar proBar = null;
public void doProgress(int cur_number){
proBar.setMax(100);
proBar.setProgress(0);
if (cur_number >= 0 &&  isPlay()){
refresh();
}
}

private void refresh(){
curTime = System.currentTimeMillis();
totalTime = curTime – beginTime;
try{
progressTime = ((int)totalTime * proBar.getMax() /
(int)(contentLen * 250));
}catch(Exception e){}
proBar.setProgress(progressTime);
Message message = handler.obtainMessage(25);
handler.removeMessages(25);
handler.sendMessageDelayed(message, 1000);
}

然后在Handler接收处理中再次调用refresh()方法。其中contentLen为新闻内容的总长度。
四:后台播放新闻服务(Service和BroadcastReceiver的使用):
(1) 新闻播放:响应新闻单击事件——发送Message消息——后台播放新闻。
后台播放新闻:
1)使用AIDL实现IPC通信服务:
A) 创建INewsService.aidl文件,在这个接口文件中定义一些实现控制播放新闻的方法。
B)在NewsService中创建一个类以扩展这个接口的Stub内部抽象类。并实现远程调用.aidl文件中定义的几个方法。
如:INewsService.Stub mBinder = new InewsService.Stub()
C)向客户端开放端口,在NewsService中重载onBind(Intent)方法,并返回实现上述接口的类的一个实例mBinder。
2) 调用类调用远程接口:
A) 声明一个接口类型的变量mService:InewsService mService = null;
B)实现ServiceConnection。重载onServiceDisconnected方法。
C)调用Context.bindService(),并在ServiceConnection实现中进行传递。这一步在NewsObj.java中实现。
D) 将在onServiceConnected()(NewsObj.java)实现中收到的Ibinder的实例转换成INewsService类型。
E)调用INewsService中定义的方法。一定要捕获DeadObjectException异常
F)断开服务连接,调用接口实例中的Context.unbindService()方法(NewsObj.java)。
(2) Service
运行于应用程序进程的主线程中,因此Service不会阻塞其他组件和用户界面。
????Service是不能自己启动的,必须通过Context对象(如一个Activity)调用startService或bindService方法来启动(用这两种方法启动的Service的生命周期不同)。
1.调用startService方法
a)若Service没有启动,则首先会调用该Service的onCreate方法,然后再调用onStart方法。
b)若Service已经启动,则会直接调用onStart方法
c)该方法启动的Service,可以通过Context对象调用stopService来关闭,也可以通过Service自身调用stopSelf()或stopSelfResult()来关闭,关闭之前调用onDestory方法。
2.调用bindService方法,使当前Context对象通过一个ServiceConnection的对象绑定到所指定的Service
a)若Service没有启动,则首先会调用该Service的onCreate方法初始化启动,然后调用Service的onBind方法初始化绑定。
b)如果绑定Service的Context对象被销毁时,被绑定的Service也会调用onUnbind 和 onDestroy方法停止运行
c)注意: BroadcastReceiver是不能绑定服务的。
d)一个绑定Service的Context对象还可以通过unbindService()来取消对服务的绑定。
e)取消时,Service会调用unbind方法,若Service是通过bindService来启动的,还会调用onDestroy方法来停止服务。
Service状态回调:
onCreate ——onStart——onBind——onRebind——onUnbind——onDestroy?。

(3)BroadcastReceiver
A) 在NewsService中的onCreate方法中注册要发生的Action及接收Action的BroadcastReceiver。
在接收到的Action处理中发送Message,然后在Handler处理中广播这些Action,利用sendBroadcast(Intent)。
在newsmain.java中接收NewsService中的Action。在此之前必须调用NewsObj.bindToService(this, this)方法。
B) Android中的广播要么来自于系统,要么来自普通应用程序。
很多事件都可能导致系统广播,如手机所在时区发生变化,电池电量低,用户改变系统语言设置等。来自普通应用程序,如一个应用程序通知其他应用程序某些数据已经下载完毕。为了响应不同的事件通知,应用程序可以注册不同的BroadcastReceiver。所有的BroadcastReceiver都继承自基类BroadcastReceiver。
BroadcastReceiver自身并不实现图形用户界面,但是当它收到某个通知后,BroadcastReceiver可以启动Activity作为响应,或者通过NotificationMananger提醒用户。BroadcastReceiver是对发送出来的Broadcast进行过滤接收并响应的一类组件。
发送Broadcast信息
1.把要发送的信息和用于过滤得信息(如Action、Category)装入一个Intent对象
2.调用Context.sendBroadcast()、sendOrderBroadcast()、sendStickyBroadcast()方法,广播该Intent对象
3.使用sendBroadcast() 或sendStickyBroadcast()方法发出去的Intent,所有满足条件的BroadcastReceiver都会随机地执行其onReceive()方法;
4.而sendOrderBroadcast()发出去的Intent,会根据BroadcastReceiver注册时IntentFilter设置的优先级的顺序来执行,相同优先级的BroadcastReceiver则是随机执行
5.sendStickyBroadcast()方法主要的不同是,Intent在发送后一直存在,并且在以后调用registerReceiver()注册相匹配的Intent时会把这个Intent直接返回。
6.若在使用sendBroadcast()方法时指定了接收的权限,这只有在AndroidManifest.xml中用<uses-permission>标签声明了拥有此权限的BroadcastReceiver才会有可能接收到发送来的Broadcast。
7.若在注册BroadcastReciever时,指定了可接收的Broadcast的权限,则只有在包内的AndroidManifest.xml中用<uses-permission>标签声明了,拥有此权限的Context对象所发送的Broadcast才有可能被这个BroadcastReceiver所接收。
接收Broadcast消息
1.继承BroadcastReceiver 类,并实现onReceive方法
2.注册BroadcastReceiver(有2种方法:一种方法是,静态地在AndroidManifest.xml中用<receiver>标签声明,并在标签内用<intent-filter>标签设置过滤器; 另一种方法,动态地在代码中先定义并设置好一个IntentFilter对象,然后再需要注册的地方调用Context.registerReceiver()方法) (取消注册时,调用Context.unregisterReceiver()方法)


错误总结:
1:刷新界面
因为播放的新闻不定时的改变,所以每次事件引起UI发生时要调用list.invalidateViews( )方法,每次调用list.invalidateViews( )方法时会重新bindView界面以达到刷新的效果。
2:Handler 与 Message的使用
3:Broadcast与 BroadcastReceiver的使用
4:UI界面的改变不影响后台新闻的播放,当用户单击返回按钮后新闻继续播放,重新进入应用后继续播放上次的新闻。所以必须对当前后台播放的新闻所属类别与当前的position做判断。
5:进度条进度值的设置。progressTime表示进度,必须声明为static类型。
6:新闻奇数行与偶数行的背景色不一样,可以利用position求余的方法选择背景色的设置。
if(p%2 == 0){
}else{

7:实现进度条时最好使用Handler和Message间隔性的刷新进度,避免使用线程以防不断单击新闻创建了多个线程,增加了CPU开销。
8:调用AIDL中定义的方法时最好捕获DeadObjectException异常。
9:View.GONE ,View.INVISIBLE 和View.VISIBLE的正确使用。
10:重新设置View的LayoutParams时必须导入正确的包。

热点排行