2016-07-18 8 views
-1

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

}

Antwort

1

Sie setzen mStartTime- in onCreate(), was bedeutet, dass es nur einmal initialisiert wird.

Danach wird onStartCommand() aufgerufen, aber der mStartTime Zeitstempel wird nicht aktualisiert, so dass die while Schleife nie ausgeführt wird.

Ich glaube, dass das Verschieben der Zeile, in der Sie mStartTime zu onStartCommand() vor der while Schleife initialisieren, Ihren Thread wieder aufhängen wird.

+0

oh ..yes..ur wahr..danke..ich coulndt das realisieren – user2121

Verwandte Themen