我不确定这是否是正确的方法,但我会尝试解释我想要做的事情。
我有一个Activity
,会创建一个名为fragment
的{{1}}标签。我想要做的是创建并启动一个TemporaryFragment
的服务,然后Timer
更新Timer
中的时间。
我想要去的方式是某种方式,当TextView
开始时,将Service
从TextView
传递到Activity
然后传递{{1}保持对它的引用。
另一种可能的方法是让Service
成为Service
的监听者,然后在Activity
中调用方法来更新Service
。
任何想法都会很棒,也许还有一些选择。
提前致谢。
ADDITION 对不起,我还应该指明我需要这个计时器才能在后台运行。因此,当应用程序被发送到后台时,我需要定时器继续进行,并且只在我告诉它时停止。
答案 0 :(得分:0)
我会使用一个更简单的方法:
public class MainActivity extends Activity implements Callback {
private static final int MSG_UPDATE = 1;
private static final long INTERVAL = 1000; // in ms
private final Handler handler = new Handler(this);
private Thread worker;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean handleMessage(Message msg) {
switch (msg.what) {
case MSG_UPDATE:
updateView();
return true;
}
return false;
}
private void updateView() {
// TODO tbd
}
@Override
protected void onStart() {
super.onStart();
// start background thread
worker = new Thread(new Runnable() {
public void run() {
while (!Thread.currentThread().isInterrupted()) {
try {
Thread.sleep(INTERVAL);
} catch (InterruptedException e) {
break;
}
// send message to activity thread
handler.sendEmptyMessage(MSG_UPDATE);
}
}
});
worker.start();
}
@Override
protected void onStop() {
super.onStop();
// stop background thread
worker.interrupt();
try {
worker.join();
} catch (InterruptedException e) {
}
worker = null;
}
}
答案 1 :(得分:0)
您可以使用TimerTask
类。覆盖TimerTask.run()
方法,然后将TimerTask
添加到Timer
类。
答案 2 :(得分:0)
服务不适合像这样的小任务,而且,服务可以独立于活动运行。如果您正在考虑移动应用程序的术语,那么产生新线程或使用将新线程引入应用程序的计时器对于这个相对较小的原因并不理想。
而是在片段中使用Handler
。
在片段中创建处理程序
private Handler mHandler = new Handler();
执行您定义的任务调用
mHandler.postDelayed(mUpdateTask, 1000);
或
mHandler.post(mUpdateTask);
并在片段中定义您的任务
private Runnable mUpdateTask = new Runnable() {
public void run() {
Toast.makeText(getActivity(), "hello world", Toast.LENGTH_SHORT).show();
mHandler.postDelayed(this, 1000);
}
};
如果您要显示类似时间的信息而不是倒计时信息,请使用
mHandler.removeCallbacks(mUpdateTimeTask);
在onPause()
方法中停止执行您的任务,如果活动不可见,因为更新用户界面不相关且节省了电池(您在onResume()
方法中再次启动任务)
答案 3 :(得分:0)
基本上,计时器背后的想法最终我将在我的应用程序中添加一些跟踪,因此即使应用程序不在前台也需要它继续运行 - Disco S2
根据此评论,我建议您使用位于后台的local service,执行此操作(从Service#onStart
启动一个帖子),直到它被stopService(..)
停止。
另一方面,活动可以绑定和取消绑定到该服务(请参阅:bindService(..))以获得有关更新的通知或以任何方式与服务进行通信。