Android以降のデスクサービスは、本アプリケーションActivityがスタックトップにあるかどうかを判断します

3153 ワード

Android開発では、自分のサービスがバックグラウンドで実行されているかどうかをよく知りたいのですが、バックグラウンドで実行されているサーバの優先度が低下し、システムに回収される可能性が高いので、どうすればいいのでしょうか.Googleはサービスをフロントに実行することをお勧めします.サービスがバックグラウンドで実行されているかどうかを知るにはどうすればいいですか?スタック情報におけるスタックトップのActivityが本アプリケーションであるかどうかを取得すればよい.
1.次は関健部分のコードです.
()
mPackageNameは本アプリケーションパッケージ名、mActivity ManagerはActivity管理オブジェクト
mActivityManager = ((ActivityManager) getSystemService(Context.ACTIVITY_SERVICE));
mPackageName = getPackageName();
	public boolean isAppOnForeground() {
		List<RunningTaskInfo> tasksInfo = mActivityManager.getRunningTasks(1);
		if (tasksInfo.size() > 0) {
			L.i("top Activity = "
					+ tasksInfo.get(0).topActivity.getPackageName());
			//            
			if (mPackageName.equals(tasksInfo.get(0).topActivity
					.getPackageName())) {
				return true;
			}
		}
		return false;
	}

2.次はまた新しい問題があります.私たちはいつこの関数を呼び出しますか?2つの方法があります.1つはアクティブで、1つは受動的です.
①.プロアクティブな方法:サービスでスレッドを開き、一定の時間ごとにこの関数を呼び出すことができます.
②.パッシブメソッド:BaseActivityをカスタマイズしてActivityを継承し、onPause関数でサービス内のこの関数をコールバックして通知します.その後、アプリケーション内の各ActivityはBaseActivityを継承し、スタックの上部にこのアプリケーションのActivityがあるかどうかを知ることができます.
3.スタックトップのActivityが本アプリケーションではないことを知っていると、サービスの優先度が低下します.つまり、システムにメモリが必要な場合、まずこのサービスで消費されたメモリが回収されます.この場合、サービスをフロントに設定するだけで実行できます.
①.フロントに設定:最初のパラメータは通知ID、2番目のパラメータはNotificationオブジェクト
startForeground(SERVICE_NOTIFICATION, n);
②.フロントサービスを停止して呼び出す:trueは通知バーをクリアすることを表します
stopForeground(true);
public void updateServiceNotification(String message) {
		if (!PreferenceUtils.getPrefBoolean(this,
				PreferenceConstants.FOREGROUND, true))
			return;
		String title = PreferenceUtils.getPrefString(this,
				PreferenceConstants.ACCOUNT, "");
		Notification n = new Notification(R.drawable.login_default_avatar,
				title, System.currentTimeMillis());
		n.flags = Notification.FLAG_ONGOING_EVENT | Notification.FLAG_NO_CLEAR;

		Intent notificationIntent = new Intent(this, MainActivity.class);
		notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
		n.contentIntent = PendingIntent.getActivity(this, 0,
				notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);

		n.setLatestEventInfo(this, title, message, n.contentIntent);
		startForeground(SERVICE_NOTIFICATION, n);
	}

	//               ,              ,
	Runnable monitorStatus = new Runnable() {
		public void run() {
			try {
				L.i("monitorStatus is running... " + mPackageName);
				mMainHandler.removeCallbacks(monitorStatus);
				//              
				if (!isAppOnForeground()) {
					L.i("app run in background...");
					// if (isAuthenticated())//         。
					updateServiceNotification(getString(R.string.run_bg_ticker));
					return;//         ,           
				} else {
					stopForeground(true);
				}
				mMainHandler.postDelayed(monitorStatus, 1000L);
			} catch (Exception e) {
				e.printStackTrace();
				L.i("monitorStatus:"+e.getMessage());
			}
		}
	};

OK、以上は私のお菓子の体験だけで、正しくないところがあるかもしれませんが、皆さん、チェックして使ってください.ありがとうございます.