我使用Service
管理从服务器到客户端和客户端到服务器的数据。我在登录后呼叫一个Service
:
context.startService(new Intent(LoginActivity.this, CheckAutoSyncReceivingOrder.class));
context.startService(new Intent(LoginActivity.this, CheckAutoSyncSendingOrder.class));
我在Service
它在Every 1上调用另一个名为
ReceivingOrderService
的服务 分钟从服务器获取更新数据。
public class CheckAutoSyncReceivingOrder extends Service {
Timer timer;
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
Log.i(TAG, "CheckAutoSyncReceivingOrder Binding Service...");
return null;
}
@Override
public void onStart(Intent intent, int startId) {
// TODO Auto-generated method stub
if (timer != null) {
timer.cancel();
Log.i(TAG, "RECEIVING OLD TIMER CANCELLED>>>");
}
timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
Log.i(TAG, "<<<<<<<<< RECEIVING AUTO SYNC SERVICE <<<<<<<<");
if (InternetConnection.checkConnection(getApplicationContext())) {
if (getDatabasePath(DatabaseHelper.DATABASE_NAME).exists())
startService(new Intent(
CheckAutoSyncReceivingOrder.this,
ReceivingOrderService.class));
} else {
Log.d(TAG, "Connection not available");
}
}
}, 0, 60000); // 1000*60 = 60000 = 1 minutes
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
if (timer != null)
timer.cancel();
Log.d(TAG, "Stopping Receiving...");
super.onDestroy();
}
}
它在每2.5上调用另一个名为
SendingOrderService
的服务 分钟将更新的数据发送到服务器。
public class CheckAutoSyncSendingOrder extends Service {
Timer timer;
@Override
public void onStart(Intent intent, int startId) {
// TODO Auto-generated method stub
if (timer != null) {
timer.cancel();
Log.i(TAG, "OLD TIMER CANCELLED>>>");
}
timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
Log.i(TAG, ">>>>>>>> SENDING AUTO SYNC SERVICE >>>>>>>>");
if (InternetConnection.checkConnection(getApplicationContext())) {
if (getDatabasePath(DatabaseHelper.DATABASE_NAME).exists())
startService(new Intent(CheckAutoSyncSendingOrder.this,
SendingOrderService.class));
} else {
Log.d(TAG, "connection not available");
}
}
}, 0, 150000); // 1000*60 = 60000 = 1 minutes * 2.5 = 2.5 =>Minutes
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
if (timer != null)
timer.cancel();
Log.d(TAG, "Stopping Sending...");
super.onDestroy();
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
两个Activity都会运行直到Internet关闭。当Internet连接可用时,它将自动再次呼叫。
主要是我遇到问题自动销毁活动服务电话。
是否有任何解决方案或方法可以改变相同的流程?
提前感谢你。
答案 0 :(得分:2)
当服务启动时,它的生命周期独立于启动它的组件,并且该服务可以无限期地在后台运行,即使启动它的组件被销毁也是如此。因此,当通过调用stopSelf()完成其工作时,服务应该自行停止,或者另一个组件可以通过调用stopService()来停止它。
由于您&#34;除了Activity
中的onCreate()&#34; 之外没有覆盖任何其他方法,您可能会遇到以下情况:
Service
,否则无法调用onDestroy()
stopService()
{/ 1}} Timer
中的结果会继续执行其工作。根据文档停止服务。
修改(关于您的评论):
&#34;当我销毁活动时它开始新工作&#34; 意味着系统终止了服务,因为你没有覆盖onStartCommand()
的默认返回值是START_STICKY
,服务已重新创建,并且已调用其onStart()
方法。
您无法更改此类系统行为。但您可以在foreground中运行该服务。
答案 1 :(得分:2)
您必须使用IntentService
代替Service
。
Service
在后台运行,但它在应用程序的主线程上运行。IntentService
在单独的工作线程上运行。如果运行您服务的进程被终止,Android系统将自动重启它,这是默认行为。
因此,如果活动的主要线程被销毁,则服务将重新启动,但如果您使用IntentService
并使用START_NOT_STICKY
则不会重新启动您的服务。
此行为由Service实现中onStartCommand()
的返回值定义。常量START_NOT_STICKY
告诉Android,如果该进程在#34; kill&#34;中运行,则不会重新启动该服务。
您需要在服务类中覆盖方法onStartCommand()
,并将所有代码从onStart()
方法移至onStartCommand()
方法。
根据Android文档:
每次重新启动服务时都会调用{p>对于已启动的服务,还有两种主要模式 根据他们的价值,他们可以决定参加比赛 从
onStartCommand()
返回:START_STICKY
用于提供服务 根据需要明确启动和停止,START_NOT_STICKY
或START_REDELIVER_INTENT
仅用于服务 在处理发送给他们的任何命令时保持运行
onStart()
方法,但如果您返回onStartCommand()
,则不会调用START_NON_STICKY
方法。
有关IntentService
和Service
之间差异的详细信息。你可以查看this。
我希望这会对你有所帮助。