android Service中自定义的Binder如何操作service中的handler
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android Service中自定义的Binder如何操作service中的handler相关的知识,希望对你有一定的参考价值。
//根据文件的下载状态来调整通知栏的状态
Handler handler=new Handler()
public void handleMessage(Message msg)
//更新下载进度的时候
if(msg.what==updateProgress)
DecimalFormat format=new DecimalFormat("0.00");
String progress=format.format(i);
remoteViews.setTextViewText(R.id.tvHint,"已下载"+progress+"%");
remoteViews.setProgressBar(R.id.progressbar, 100, i, false);
notify.contentView=remoteViews;
notifyManager.notify(NOTIFICATION_ID, notify);
//下载成功的时候
else if(msg.what==downLoadSuccess)
remoteViews.setTextViewText(R.id.tvHint,"下载完成");
remoteViews.setProgressBar(R.id.progressbar, 100, 100, false);
notify.contentView=remoteViews;
notifyManager.notify(NOTIFICATION_ID, notify);
if(timer!=null&&task!=null)
timer.cancel();
task.cancel();
//notifyManager.cancel(NOTIFICATION_ID);
//下载失败的时候
else if(msg.what==downLoadSuccess)
if(timer != null && task != null)
timer.cancel();
task.cancel();
notifyManager.cancel(NOTIFICATION_ID);
stopService(new Intent(getApplicationContext(),DownLoadService.class));//stop service
;
class downloadTaskExecuteBinder extends Binder
//再此处顺序执行下载任务并将结果返回给MainActivity
public void taskExecute()
//在这里写文件下载代码
while(i<100)
i+=5;
handler.sendEmptyMessage(updateProgress);
System.out.println(""+i);
handler.sendEmptyMessage(downLoadSuccess);
为什么外面调用binder.taskExecute()系统通知栏没有变化啊,应该是handler没有接收到消息,应该怎么改求大神指点啊,没分了。。。。
handler和自定义的Binder都是定义在同一个DownLoadService中,在另一个Activity中绑定了这个service,想在Activity中调用自定义Binder中的一个方法执行,是不是消息发送到Acitivity中去了???
binder.taskExecute()里头你没有涉及到“系统通知栏”的代码,所以当然没有变化!!!
其次,你对于handler的理解有错误。我粗粗点下:
thread A和thread B。A有B的Handler从而能和B通过Handler沟通。B也有A的Handler。当然,这个Handler都是在A或者B构造函数的时候传进去的(例如A exampleA = new A(B's handler);)
至于两个thread如何根据handler沟通?通过Message来沟通。线程A和B都有一个message queue(消息队列)。你构建一个message实例,然后将它加入到(此处具体化,例如放入B里头)线程的message queue里头中。这样线程(从队列里读一条处理一条就可以处理到你加入的Message,用Handler的handleMessage来处理)。(下面用aHandler,bHandler分别表示thread A的handler和B的hanler。)所以aHandler.sendEmptyMessage(int what)就是在添加一只带有what值的Message到A里头。bHandler....类似。
所以,假设我现在是A,我为了告诉B一些东西,我就将我要告诉的B的东西(信息)放入到一个Message中,再将这个Message加入到B的消息队列中。(譬如你此问中,需要将“下载完成”“下载失败”这些信息添加进入message里头)。然后这个message怎么加入到B的消息的队列呢?这就是为什么要在A的构造函数里头传入B的Handler(bHandler)一个引用的原因。
对于你的需求,Handler和Binder功能重复了。要么用Binder,要么用Handler。
至于想在一个activity中调用自定义Binder里头的一个方法,不需要发送消息。只需要在需要调用的地方实例化一个Binder,然后通过这个实例.functionYouNeeded()就行。
欢迎追问。
Android中自定义Dialog样式
转载:Android中自定义Dialog样式
dialog代码
public class MyMiddleDialog extends Dialog
private Context context;
public MyMiddleDialog(Context context)
super(context);
public MyMiddleDialog(Context context, int themeResId)
super(context, themeResId);
this.context = context;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View layout = inflater.inflate(R.layout.register_y_d, null);
this.setContentView(layout);
dialog样式
<style name="MyMiddleDialogStyle" parent="@android:style/Theme.Holo.Light.Dialog">
<!-- 窗口背景色 -->
<item name="android:windowBackground">@android:color/transparent</item>
<!--是否有覆盖-->
<item name="android:windowContentOverlay">@null</item>
<!-- 浮于Activity之上 -->
<item name="android:windowIsFloating">true</item>
<!-- 边框 -->
<item name="android:windowFrame">@null</item>
<!-- Dialog以外的区域模糊效果 -->
<item name="android:backgroundDimEnabled">true</item>
<!-- 无标题 -->
<item name="android:windowNoTitle">true</item>
<!-- 半透明 -->
<item name="android:windowIsTranslucent">true</item>
<!--进出动画-->
<item name="android:windowAnimationStyle">@android:style/Animation.Translucent</item>
</style>
调用dialog代码
//设置样式
MyMiddleDialog myMiddleDialog = new MyMiddleDialog(getActivity(), R.style.MyMiddleDialogStyle);
Window window = myMiddleDialog.getWindow();
//设置边框距离
window.getDecorView().setPadding(0, 0, 0, 0);
//设置dialog位置
window.setGravity(Gravity.RIGHT|Gravity.TOP);
WindowManager.LayoutParams lp = window.getAttributes();
//设置宽高
lp.width = WindowManager.LayoutParams.WRAP_CONTENT;
lp.height = WindowManager.LayoutParams.WRAP_CONTENT;
window.setAttributes(lp);
//设置点击Dialog外部任意区域关闭Dialog
myMiddleDialog.setCanceledOnTouchOutside(true);
myMiddleDialog.show();
以上是关于android Service中自定义的Binder如何操作service中的handler的主要内容,如果未能解决你的问题,请参考以下文章