要了解Android中IntentService和Service之间的区别,我创建了以下发布的Service类的小测试。 MainActivity有一个Button,按下时, 服务将使用startService()启动,如下面的代码所示,这将导致对onStartCommand()的调用。在onStartCommand()中,我运行一个循环10秒,然后我 预计,该循环将阻止UI" butoon"。实际上,当我第一次启动服务时发生了什么,但是当我在10秒后按下按钮时 过去了,它将导致对onStartCommand()的调用,但onStartCommand()内的日志消息永远不会显示,而且UI永远不会被阻止。
任何人都可以解释一下onStartCommand()的执行内容是什么,只有当服务首次启动时才会阻止用户界面,而不是之后?
MainActivity
public class MainActivity extends AppCompatActivity {
private Button mbtnSend = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
this.mbtnSend = (Button) findViewById(R.id.btn_send);
this.mbtnSend.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getApplicationContext(), MyService.class);
startService(intent);
}
});
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
registerReceiver(this.mBCR_VALUE_SENT, new IntentFilter(MyIntentService.INTENT_ACTION));
this.mbtnSend = (Button) findViewById(R.id.btn_send);
this.mbtnSend.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getApplicationContext(), MyIntentService.class);
intent.putExtra("intent_key", ++i);
startService(intent);
}
});
}
}
MyIntentService :
public class MyService extends Service{
private final String TAG = this.getClass().getSimpleName();
private long mStartTime;
@Override
public void onCreate() {
super.onCreate();
Log.w(TAG, SubTag.msg("onCreate"));
this.mStartTime = TimeUtils.getTSSec();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.w(TAG, SubTag.msg("onStartCommand"));
while ( (TimeUtils.getTSSec() - this.mStartTime) <=10) {
Log.w(TAG, SubTag.msg("time: " + (TimeUtils.getTSSec() - this.mStartTime)));
SystemClock.sleep(1000);
}
return Service.START_STICKY;
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
Log.w(TAG, SubTag.msg("onBind"));
return null;
}
@Override
public void onDestroy() {
super.onDestroy();
Log.w(TAG, SubTag.msg("onDestroy"));
}
}
答案 0 :(得分:1)
您在mStartTime
中将TimeUtils.getTSSec()
设置为onCreate()
,这意味着它只会被初始化一次。
之后,调用onStartCommand()
,但mStartTime
时间戳未更新,因此while
循环永远不会运行。
我相信在mStartTime
循环之前移动您初始化onStartCommand()
到while
的行会使您的主题再次挂起。