Um den Unterschied zwischen IntentService und Service in Android zu kennen, habe ich den unten angegebenen kleinen Test einer Service-Klasse erstellt. Die MainActivity verfügt über eine Schaltfläche. Wenn sie gedrückt wird, wird der Dienst mit startService() gestartet, wie unten im Code gezeigt, was zu einem Aufruf von onStartCommand() führt. In onStartCommand(), ich führe eine Schleife für 10 Sekunden, und ich erwartet, dass diese Schleife die Benutzeroberfläche "the Butoon" blockiert. Eigentlich, was genau passiert ist, wenn ich den Dienst zum ersten Mal starte, aber wenn ich den Knopf nach den 10 Sekunden verlasse, wird es zu einem Aufruf von onStartCommand() führen, aber die Protokollmeldung in der onStartCommand() wird nie angezeigt plus die UI wird niemals blockiert.Warum wird der Body von onStartCommand() nur einmal ausgeführt?
Kann jemand bitte erklären, was der Körper der onStartCommand() ausgeführt wird und blockiert die Benutzeroberfläche nur, wenn der Dienst zuerst gestartet wurde und nie danach?
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"));
}
}
oh ..yes..ur wahr..danke..ich coulndt das realisieren – user2121