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中去了???

参考技术A 你描述不清出。至少我没看清楚。我尝试按照我自己对你描述的问题的理解来作答。
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的主要内容,如果未能解决你的问题,请参考以下文章

如何在Android中自定义动画

在android中自定义表格布局

Android中自定义Dialog样式

在android中自定义评分栏

android中自定义广播需要哪个权限

在Android中自定义锁屏的任何教程[关闭]