android - 在基于服务的类中设置监听器

标签 android android-service

嗨,我在服务中设置 ServiceUpdateUIListener 以更新 UI 时遇到问题。创建一个新的服务对象并在那里设置监听器并将其放入 Intent 中是错误的。

代码源位于 http://developerlife.com/tutorials/?p=356在那里我找不到如何设置监听器并正确启动服务。

调用:

TimerService service = new TimerService();
                TimerService.setUpdateListener(new ServiceUpdateUIListener() {

                    @Override
                    public void updateUI(String time) {
                        clock.setText(time);

                    }
                });

                Intent i  = new Intent(Timer.this,service.class); //service cannot be resolved to a type
                i.putExtra("ms", ms);
                startService(i);  

服务:

 public class TimerService extends Service{

        CountDownTimer timer;
        Chronometer clock;
        public static ServiceUpdateUIListener UI_UPDATE_LISTENER;

        @Override
        public IBinder onBind(Intent intent) {

            return null;
        }
        @Override
        public void onStart(Intent intent, int startId) {
            // TODO Auto-generated method stub
            int ms = intent.getIntExtra("ms", 0);

            timer = new  CountDownTimer(ms,1000){
                @Override
                public void onTick(long millisUntilFinished) {

                    int seconds = (int) (millisUntilFinished / 1000) % 60 ;
                    int minutes = (int) ((millisUntilFinished / (1000*60)) % 60);
                    int hours   = (int) ((millisUntilFinished / (1000*60*60)) % 24);

                    clock.setText( String.format("%02d:%02d:%02d", hours,minutes,seconds));
                    Log.e("Timer", String.valueOf(millisUntilFinished));

                }

                @Override
                public void onFinish() {
                    // TODO Auto-generated method stub

                }
            }.start();
            super.onStart(intent, startId);
        }
        public static void setUpdateListener(ServiceUpdateUIListener l) {
             UI_UPDATE_LISTENER = l;

        }

最佳答案

服务文档有相当完整的示例代码,用于在您的应用中实现服务,您的应用的另一部分可以绑定(bind)到该服务并对其进行调用:

http://developer.android.com/reference/android/app/Service.html#LocalServiceSample

只需将您的 setUpdateListener() 方法放在服务上,并在服务获得 onServiceConnected() 后调用它。

所以你的代码应该是这样的:

public interface UpdateListener {
    public void onUpdate(long value);
}

class LocalService {
    // Like in the Service sample code, plus:

    public static String ACTION_START = "com.mypackage.START";

    private final ArrayList<UpdateListener> mListeners
            = new ArrayList<UpdateListener>();
    private final Handler mHandler = new Handler();

    private long mTick = 0;

    private final Runnable mTickRunnable = new Runnable() {
        public void run() {
            mTick++;
            sendUpdate(mTick);
            mHandler.postDelayed(mTickRunnable, 1000);
        }
    }

    public void registerListener(UpdateListener listener) {
        mListeners.add(listener);
    }

    public void unregisterListener(UpdateListener listener) {
        mListeners.remove(listener);
    }

    private void sendUpdate(long value) {
        for (int i=mListeners.size()-1; i>=0; i--) {
            mListeners.get(i).onUpdate(value);
        }
    }

    public int onStartCommand(Intent intent, int flags, int startId) {
        if (ACTION_START.equals(intent.getAction()) {
            mTick = 0;
            mHandler.removeCallbacks(mTickRunnable);
            mHandler.post(mTickRunnable);
        }
        return START_STICKY;
    }

    public void onDestroy() {
        mHandler.removeCallbacks(mTickRunnable);
    }

现在您可以启动该服务以使其开始计数,任何人都可以绑定(bind)到它以注册一个监听器以在它计数时接收回调。

要很好地回答您的问题真的很难,因为您并没有真正说出您真正想要完成的事情。有多种使用服务的方法,可以是启动服务,也可以是绑定(bind)服务,也可以是将两者混合在一起,具体取决于您想要完成的任务。

现在您可以根据示例再次实现您的客户端代码:

public class SomeActivity extends Activity implements UpdateListener {
    private LocalService mBoundService;

    private ServiceConnection mConnection = new ServiceConnection() {
        public void onServiceConnected(ComponentName className, IBinder service) {
            mBoundService = ((LocalService.LocalBinder)service).getService();
            mBoundService.registerListener(this);
        }

        public void onServiceDisconnected(ComponentName className) {
            mBoundService = null;
        }
    };

    void doBindService() {
        bindService(new Intent(Binding.this, 
                LocalService.class), mConnection, Context.BIND_AUTO_CREATE);
        mIsBound = true;
    }

    void doUnbindService() {
        if (mIsBound) {
            if (mBoundService != null) {
                mBoundService.unregisterListener(this);
            }
            unbindService(mConnection);
            mIsBound = false;
        }
    }

    protected void onDestroy() {
        super.onDestroy();
        doUnbindService();
    }

关于android - 在基于服务的类中设置监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7659974/

相关文章:

android - 在主屏幕小部件的 ListView 上方添加一个按钮 - 如何捕获单击此按钮?

Android访问其他应用方法?

android - 几分钟后服务自动停止

使用 Service 或 IntentService 的 Android Client/Server Socket 通信

Android: list :$ 符号代表什么?

android - 将特征添加到android

Android 在发送短信时删除已选择的联系人

android - 强制停止后如何保持服务运行?

android - 我怎样才能知道我的服务是否已经开始

Android 在 Air 原生扩展调用它之前启动我的服务