java Android服务+计数器不工作
我正在开发一个可以按时计算屏幕的应用程序。首先,我构建了一个服务,将计数计时器值(如00:00)发送到MainActivity
,下面是我的服务实现
public class MyService extends Service {
String time;
Intent io;
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO Auto-generated method stub
return START_STICKY;
}
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
try{
PowerManager power=(PowerManager) getSystemService(POWER_SERVICE);
boolean isScreenOn=power.isScreenOn();
while(isScreenOn){
try{
StopWatch count=new StopWatch();
long timer=count.getTime();
long seconds=timer/1000;
time = String.format("%02d:%02d", (seconds % 3600) / 60, (seconds % 60));//creating time
}catch(Exception e){
e.printStackTrace();
}
io=new Intent("COUNTDOWN_UPDATED");
io.putExtra("countdown",time);
sendBroadcast(io);// sending time value
}
}catch(Exception e){
e.printStackTrace();
}
}
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
这里是来自org.apache.commons.lang.time.StopWatch
的秒表类,它可以从0开始计数计时器。
这是我的MainActivity
实现
Intent service=new Intent(this,MyService.class);
startService(service);
registerReceiver(updateGUI,new IntentFilter("COUNTDOWN_UPDATED"));
private BroadcastReceiver updateGUI=new BroadcastReceiver(){
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
TextView countdown= (TextView)findViewById(R.id.textView1);
countdown.setText(intent.getExtras().getString("countdown"));
}
};
当我运行我的应用程序时,计数器没有运行,而是停留在00:00
# 1 楼答案
你的onCreate只用于初始化东西,使用
@Override public int onStartCommand(Intent i, int flags , int startId){
从文件中:
onStartCommand
每次客户端通过调用 安卓所容纳之物上下文startService,提供它提供的参数和唯一的整数标记 表示启动请求。不要直接调用这个方法。 为了向后兼容,默认实现调用onStart并返回START\u 或者开始兼容。 如果需要应用程序在API级别5之前的平台版本上运行,可以使用以下方法 模型来处理这种情况下较旧的onStart回调。handleCommand方法由您酌情实现
而作为:
onCreate()
首次创建服务时由系统调用。不要直接调用这个方法。 重写:服务中的onCreate()
如果您只想随时间在文本视图中设置值的动画,为什么不使用值动画工具呢? 例如:
# 2 楼答案
虽然不是很明显,但在Android上,默认情况下应用程序的UI线程上会执行
Service
为了减轻工作量,工具箱中有一个方便的类
IntentService
,用于启动您希望在后台执行的工作让类扩展
IntentService
后,重写onHandleIntent(Intent intent)
方法,并将广播生成代码放在那里,而不是放在onCreate
中这将释放您的UI线程,以继续按预期运行
(注意,在循环中,您永远不会更新
isScreenOn
的值,因此它将始终保持不变!)