appプログラムはバックグラウンドに入るか、携帯電話の画面を閉じて、開いているタイマータスク(timersのカウントタスクを使用)が引き続き実行されることを確認します.

3098 ワード

需要:appプログラムはバックグラウンドに入るか、携帯電話の画面を閉じて、開いたタイマータスク(timersのカウントタスクを使用)を実行し続けます.
質問:携帯電話usbをデバッグしてコンピュータに接続して、プログラムはバックグラウンドあるいは携帯電話のスクリーンに入って閉じて、開いたタイマーの任務は正常に実行します;しかし,usbデータ線を抜くとタイマタスクがブロックされる.正常なカウントの効果は得られません.
シナリオ:新しいTimersServiceを作成し、サービスで定期的に実行するのはタスクの問題です.この場合、プログラムがバックグラウンドに入る場合のpublic class TimersService extends Service{
@Override
public IBinder onBind(Intent intent) {
    return null;
}

@Override
public void onCreate() {
    super.onCreate();
}

@Override
public int onStartCommand(Intent intent,int flags, int startId) {
    long currTime = intent.getLongExtra("currTime",System.currentTimeMillis());
    Logger.i("DemoLog","currTime:"+currTime);
    LocalQRCodeUtil.getInstance().calculTime(currTime);//       
    return START_STICKY;
}

@Override
public void onDestroy() {
    LocalQRCodeUtil.getInstance().stopTimer();//       
    super.onDestroy();
}

}問題:TimersServiceを追加し、携帯電話の画面を閉じ、タイマータスクは依然としてブロックされている.画面を閉じ、タイマータスクが正常に実行されていることを確認し、TimersServiceにPowerManagerを追加する必要がある.WakeLockは、画面がスリープした後もcpuの起動状態を維持し、サービスを継続させる.参照先:http://blog.csdn.net/sinat_33285127/article/details/76131349 public class TimersService extends Service {
*private PowerManager.WakeLock wakeLock = null;*

@Override
public IBinder onBind(Intent intent) {
    return null;
}

@Override
public void onCreate() {
    //  cpu       service    。
    *PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
    wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TimersService.class.getName());
    wakeLock.acquire();*
    super.onCreate();
}

@Override
public int onStartCommand(Intent intent,int flags, int startId) {
    long currTime = intent.getLongExtra("currTime",System.currentTimeMillis());
    Logger.i("DemoLog","currTime:"+currTime);
    LocalQRCodeUtil.getInstance().calculTime(currTime);
    return START_STICKY;
}

@Override
public void onDestroy() {
    //service    
    *if (wakeLock != null) {
        wakeLock.release();
        wakeLock = null;
    }*
    LocalQRCodeUtil.getInstance().stopTimer();
    super.onDestroy();
}

}
質問:AactivityでServiceを起動し、Bactivityで起動したサービスを閉じるサービスサービスサービスサービスサービスサービスサービスを使用するstartService起動方式起動サービスコード:public void calculTime(Activity mActivity,long time){Logger.e(「サービスを起動する」);stopサービス(mActivity);currentTime=time;Intent intent=new Intent(mActivity,TimersServices.class); intent.putExtra(「currTime」,currentTime);mActivity.startService(intent);mActivity.startService(intent);intent.putExtra(「currTime」,currentTime);mActivity.startサービス(intity);}サービスを閉じるコード:public void stopService(Activity mActivity){Logger.e("サービスを閉じる");Intent intent=new Intent(mActivity,TimersServices.class);mActivity.stopService(intent);注意:サービスを開始するmActivityとサービスを終了するmActivityは同じactivityクラスではありません
サービスの2つの起動モード1 startService(グローバルモード)は、バインドモードとは異なり、1つはサービスをオンにし、いずれかのactivityはサービスをオフにします.2 bindService(バインドモード)は1つのacitivtyにバインドされ、activtyはサービスを破棄します.具体的なサービスの理解と使用の参考もあります.http://blog.csdn.net/zjws23786/article/details/51800929