有关Android中Service实现UI更新(Binder的运用)

简介:

我们知道Android的程序架构本身即是遵循MVC模式设计的,将显示和逻辑操作进行了很好的分离。xml文件进行view的添加和布局,Activity来实现各种View的展示,而service实现将数据按一定逻辑在View中显示。基于这样的原则我们设计程序时,就需要做到让他们各司其职,合理搭配,如此才能使我们设计的Android程序更高效,更安全以及易于维护,当然这是一个很大很大很大的话题,此处我只对service和Activity的职责进行简单阐述,希望能起到抛砖引玉的作用,当然若内容如有雷同不胜荣幸.

    Service是在Android程序后台运行的组件,比如音乐播放,网络下载等,这些操作的确都可以在service中完成,但并不是说我们只可以再service中完成,在Activity中一样可以实现,那为什么我们还要一个service呢,曾经我也疑惑过,后来我知道了在Android中又五个进程等级(1.Foreground Process: 2.Visible Process 3.ServiceProcess4.Background Process 5.Empty Procecc)在系统内存资源不够的时候,系统会首先将等级较低的进程杀死来满足其他高等级的进程正常运行,而service正处于第三等级,而被覆盖住的Activiy处于第四等级,这样当我们在运行程序时因为某种原因而将当前Activity覆盖,那我们在该Activity中的很多操作尤其需要网络交互的很可能会因为系统内存资源不足,而将其杀掉。这样就会导致数据的不完成,使程序的鲁棒性不够强,而如果将他们都放在service中实现那就稳妥多了,程序也相对稳定多了。当然程序的稳定性是由很多因素构成的,这只是其中之一而已。那好,既然说放在service中操作,那就在那儿操作吧,这不就完了吗,可是就在我们准备这样做时,总会意识到一个问题,当我们把这些操作统统放到service中实现时,那Activity的中控件的更新怎么办,比如因为播放总会有进度条的,文件下载也是要时时更新下载量的,不知道各位怎么处理这个问题的,我在网上查了查,看到的方法都是通过广播,即在 Activity中注册一个广播,然后通过广播进行service和Activity间的数据传递,同时以达到更新UI的目的,虽然我没这么做过,但我知道这是可以的,但我总觉的,这样有点劳师动众了,而且我曾经用了一次广播,根据我的使用的效果来说觉得广播不适合做一些时时更新的操作(具体原因我没有深入研究过,不敢过多评论),反应不够及时。所以我自己就试着用别的方法进行UI更新,最后我觉得通过Binder对象实现,怎么实现我就不用文字说明了,下面我就随便写了个例子简单说明。抛砖引玉吧

用来更新UI的service

package com.gqs.service;
 
 import android.app.Service;
 import android.content.Intent;
 import android.os.Binder;
 import android.os.Handler;
 import android.os.IBinder;
 import android.os.Message;
 import android.widget.TextView;
 
 public class UpdateService extends Service {
     private int data;
     private Handler handler;
 
     @Override
     public IBinder onBind(Intent intent) {
         // TODO Auto-generated method stub
         return new MyBinder();
     }
 
     public class MyBinder extends Binder {
         public void setDate(final TextView tv, final UpdateData updata) {
             new Thread(new MyThread()).start();
             handler = new Handler() {
                 public void handleMessage(Message msg) {
                     updata.update(tv, data);
                 }
             };
         }
     }
 
     public class MyThread implements Runnable {
 
         @Override
         public void run() {
             while (true) {
                 data++;
                 Message msg = handler.obtainMessage();
                 msg.arg1 = data;
                 handler.sendMessage(msg);
                 try {
                     Thread.sleep(1000);
                 } catch (InterruptedException e) {
                     // TODO Auto-generated catch block
                     e.printStackTrace();
                 }
             }
         }
 
     }
 
     public interface UpdateData {
         public void update(TextView tv, int data);
 
     }
 }

package com.gqs.activity;

import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.gqs.service.UpdateService;
import com.gqs.service.UpdateService.MyBinder;
import com.gqs.service.UpdateService.UpdateData;


public class ServiceToActivityActivity extends Activity {
    /** Called when the activity is first created. */
    private TextView tv;
    private UpdateService.MyBinder binder;
    private Button btnStart;
    private ServiceConnection conn=new ServiceConnection() {
        
        @Override
        public void onServiceDisconnected(ComponentName name) {
            // TODO Auto-generated method stub
            
        }
        
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            // TODO Auto-generated method stub
            binder=(MyBinder) service;
            tv.setText("已连接");
        }
    };
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        btnStart=(Button)findViewById(R.id.btnStart);
        tv=(TextView)findViewById(R.id.textView);
        Intent intent=new Intent(this,UpdateService.class);
        bindService(intent, conn, Context.BIND_AUTO_CREATE);
        btnStart.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                if(binder!=null)
                {
                    binder.setDate(tv, new UpdateData() {
                        
                        @Override
                        public void update(TextView tv, int data) {
                            // TODO Auto-generated method stub
                            tv.setText(data+"");
                        }
                    });
                }
                else
                {
                    Toast.makeText(getApplicationContext(), "连接失败", 1).show();
                }
            }
        });
    }
    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        unbindService(conn);
        super.onDestroy();
    }
}

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/textView"
        android:text="@string/hello" />
    <Button 
        android:text="开始"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/btnStart"
        />
</LinearLayout>


相关文章
|
10月前
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。
|
9月前
|
XML 搜索推荐 前端开发
安卓开发中的自定义视图:打造个性化UI组件
在安卓应用开发中,自定义视图是一种强大的工具,它允许开发者创造独一无二的用户界面元素,从而提升应用的外观和用户体验。本文将通过一个简单的自定义视图示例,引导你了解如何在安卓项目中实现自定义组件,并探讨其背后的技术原理。我们将从基础的View类讲起,逐步深入到绘图、事件处理以及性能优化等方面。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和技巧。
|
10月前
|
XML 前端开发 Android开发
Android:UI:Drawable:View/ImageView与Drawable
通过本文的介绍,我们详细探讨了Android中Drawable、View和ImageView的使用方法及其相互关系。Drawable作为图像和图形的抽象表示,提供了丰富的子类和自定义能力,使得开发者能够灵活地实现各种UI效果。View和ImageView则通过使用Drawable实现了各种图像和图形的显示需求。希望本文能为您在Android开发中使用Drawable提供有价值的参考和指导。
217 2
|
11月前
|
存储 Linux Android开发
Android底层:通熟易懂分析binder:1.binder准备工作
本文详细介绍了Android Binder机制的准备工作,包括打开Binder驱动、内存映射(mmap)、启动Binder主线程等内容。通过分析系统调用和进程与驱动层的通信,解释了Binder如何实现进程间通信。文章还探讨了Binder主线程的启动流程及其在进程通信中的作用,最后总结了Binder准备工作的调用时机和重要性。
Android底层:通熟易懂分析binder:1.binder准备工作
|
12月前
|
XML Android开发 UED
💥Android UI设计新风尚!掌握Material Design精髓,让你的界面颜值爆表!🎨
随着移动应用市场的蓬勃发展,用户对界面设计的要求日益提高。为此,掌握由Google推出的Material Design设计语言成为提升应用颜值和用户体验的关键。本文将带你深入了解Material Design的核心原则,如真实感、统一性和创新性,并通过丰富的组件库及示例代码,助你轻松打造美观且一致的应用界面。无论是色彩搭配还是动画效果,Material Design都能为你的Android应用增添无限魅力。
267 1
|
存储 搜索推荐 Java
探索安卓开发中的自定义视图:打造个性化UI组件Java中的异常处理:从基础到高级
【8月更文挑战第29天】在安卓应用的海洋中,一个独特的用户界面(UI)能让应用脱颖而出。自定义视图是实现这一目标的强大工具。本文将通过一个简单的自定义计数器视图示例,展示如何从零开始创建一个具有独特风格和功能的安卓UI组件,并讨论在此过程中涉及的设计原则、性能优化和兼容性问题。准备好让你的应用与众不同了吗?让我们开始吧!
|
编解码 Android开发
【Android Studio】使用UI工具绘制,ConstraintLayout 限制性布局,快速上手
本文介绍了Android Studio中使用ConstraintLayout布局的方法,通过创建布局文件、设置控件约束等步骤,快速上手UI设计,并提供了一个TV Launcher界面布局的绘制示例。
291 1
|
API Android开发
Android项目架构设计问题之选择和使用合适的UI库如何解决
Android项目架构设计问题之选择和使用合适的UI库如何解决
121 0
|
编解码 网络协议 Android开发
Android平台GB28181设备接入模块实现后台service按需回传摄像头数据到国标平台侧
我们在做Android平台GB28181设备对接模块的时候,遇到这样的技术需求,开发者希望能以后台服务的形式运行程序,国标平台侧没有视频回传请求的时候,仅保持信令链接,有发起视频回传请求或语音广播时,打开摄像头,并实时回传音视频数据或接收处理国标平台侧发过来的语音广播数据。
122 3
|
XML Android开发 UED
💥Android UI设计新风尚!掌握Material Design精髓,让你的界面颜值爆表!🎨
【7月更文挑战第28天】随着移动应用市场的发展,用户对界面设计的要求不断提高。Material Design是由Google推出的设计语言,强调真实感、统一性和创新性,通过模拟纸张和墨水的物理属性创造沉浸式体验。它注重色彩、排版、图标和布局的一致性,确保跨设备的统一视觉风格。Android Studio提供了丰富的Material Design组件库,如按钮、卡片等,易于使用且美观。
455 1

热门文章

最新文章