2016-07-18 1 views
-1

AndroidのIntentServiceとServiceの違いを知るために、私は以下のようにServiceクラスの小さなテストを作成しました。 MainActivityにButtonがある場合、 サービスはstartService()を使用して開始され、コードにはonStartCommand()が呼び出されます。 onStartCommand()では、私は10秒間ループを実行します。そして、私は は、そのループがUI "ブーン"をブロックすると予想しています。実際にはじめてサービスを開始するときに何が起こったのですが、10秒後にボタンを押すと、onStartCommand()が呼び出されますが、onStartCommand()内のログメッセージは表示されません。 UIは決してブロックされません。なぜonStartCommand()の本体が一度だけ実行されるのですか?

誰でも、onStartCommand()の本体が実行されたことを説明して、サービスが最初に開始したときに初めてUIをブロックすることはできますか?

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

あなたは01にmStartTimeを設定していますonCreate()のは、1回だけ初期化されることを意味します。

その後、onStartCommand()が呼び出されますが、mStartTimeタイムスタンプは更新されていないため、whileループは実行されません。

mStartTimeを初期化する行をwhileループの前に移動させると、スレッドが再びハングすることが考えられます。

+0

oh ..yes..ur true..thanks..i coulndtはそれを実現します – user2121

関連する問題