一个简单的问题,只要服务生效/活动,如何在日志猫控制台上重复服务msg“hello”?我试过了:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.v("LocalService", "Received start id " + startId + ": " + intent);
Mano lopas = new Mano(this);
lopas.Lopas();
while(true) {
Log.v("HAHA", "hello");
}
// We want this service to continue running until it is explicitly
// stopped, so return sticky.
return START_STICKY;
}
但它永远不会返回START_STICKY,实际上它甚至没有建立项目。我想我错过了一些关于服务的东西?我在应用程序的MainActivity中启动我的服务,例如:
startService(new Intent(getApplicationContext(),Myclass.class));
它在我的服务中没有我的while循环只运行一次。它告诉我Logcat中的一些东西,就是这样。更重要的是,我的服务开始这么多次,我重新打开我的应用程序。如何使服务开始运行一次并“永远”,我的意思是直到它被系统杀死或用户杀死它。
答案 0 :(得分:0)
服务没有自己的线程,它们在UI线程上运行。如果您希望它并行运行,则需要创建一个Thread。所以在这里你应该在你的onStartCommand中创建一个Thread,那个线程应该做你想做的任何事情。
答案 1 :(得分:0)
同样,您可以在活动中定期记录某些内容:使用处理程序。发布记录消息的任务,并使用postDelayed(...)
将自身重新发布到同一个Handler。取消活动的onPause()
或您服务的onDestroy()
中的待处理暂停执行。
请注意,在Android中显式创建Thread或使用像TimerTask这样的J2SE结构几乎没有充分的理由。对于重量级任务,请使用AsyncTask。对于轻量级任务,请使用处理程序。在您的情况下,创建一个新的线程将是一个非常重要的解决方案,你想做什么。
答案 2 :(得分:-1)
首先,不要忘记在你的清单中注册Service
。
这可以通过
来完成<service android:enabled="true" android:name=".services.Paycan" />
接下来是,您的服务(如果它不是一个intentservice)在MainUI中运行。如果你创建一个无限循环,请确保它在后台线程中,否则它将冻结应用程序。
您可以使用Asynctask
,一个使用onStartCommand
创建并在onDestroy
停用或使用IntentService
代替Service
的主题执行此操作
示例:
public class yourTestClass extends Service {
Thread testThread;
boolean threadRunning = false;
@Override
public void onCreate() {
super.onCreate();
testThread = new Thread() {
@Override
public void run() {
try {
while(threadRunning) {
Thread.sleep(1000);
Log.i("test", "....");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
threadRunning = true;
testThread.start();
return START_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
threadRunning = false;
}