gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:33:30 24 4
gpt4 key购买 nike

嗨,我在服务中设置 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com