为什么onStartCommand()的主体只执行一次?

时间:2016-07-18 12:11:13

标签: android service android-service

要了解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"));
}

}

1 个答案:

答案 0 :(得分:1)

您在mStartTime中将TimeUtils.getTSSec()设置为onCreate(),这意味着它只会被初始化一次。

之后,调用onStartCommand(),但mStartTime时间戳未更新,因此while循环永远不会运行。

我相信在mStartTime循环之前移动您初始化onStartCommand()while的行会使您的主题再次挂起。