4

基本的に、フォアグラウンド サービスを実行するアプリケーションがあります。アプリケーションを起動したら、アプリケーションのonCreateメソッドでセッション固有の初期化を行う必要があります。

アプリを閉じると、サービスは実行され続けますが (望ましい動作)、ランチャーまたは通知からアプリを再度開くと、アプリケーションonCreateが再度呼び出されません。

私の質問は次のとおりです。

  1. onCreateサービスが実行されている場合でも、アプリケーションが再度呼び出されるようにするにはどうすればよいですか? (サービスはおそらくアプリケーション オブジェクトへの参照を保持していますよね?)
  2. アプリがサービスから再起動されたことを Application クラス内で表示する方法はありますか?
  3. 他にどのような解決策を考えられますか?

の MyService AndroidManifest.xml:

<service android:name=".MyService"
    android:exported="false"/>

私のサービスonStartCommand

    createNotificationChannel();
    Intent notificationIntent = new Intent(this, MyActivity.class);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
    Notification notification = new NotificationCompat.Builder(this, CHANNEL_ID)
            .setContentTitle("My Service")
            .setContentText("Service")
            .setSmallIcon(R.drawable.ic_android)
            .setContentIntent(pendingIntent)
            .build();
    startForeground(1, notification);
4

5 に答える 5

0

アプリが開始されたこと (少なくとも最初のアクティビティが開始されたこと) を確認する方法を見つけてから、必要に応じて初期化を行いますonCreate()。私はあなたと同じ状況に直面しています。アプリは、起動して終了したときに何かをしなければなりません。アプリがフォアグラウンド モードとバックグラウンド モードに入るのをリッスンするインターフェイスを作成しました (実行中のアクティビティはありません)。

interface IApplicationLifeCycle {
    fun onEnterForeground()
    fun onEnterBackground()
    fun onFirstCreated()
    fun onLastDestroyed()
}

次に、アプリがバックグラウンドとフォアグラウンドに入ることを検出するクラスを作成します

class AppLifeCycleTracker(private val iApplicationLifeCycle: IApplicationLifeCycle? = null) : Application.ActivityLifecycleCallbacks {
private var aliveActivityCount = 0 // created on destroyed
private var activeActivityCount = 0 // started on stopped
private var liveActivityCount = 0 // resumed on paused

override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
    aliveActivityCount++
    if (aliveActivityCount == 1) {
        iApplicationLifeCycle?.onFirstCreated()
    }
}

override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {}

override fun onActivityStarted(activity: Activity) {
    activeActivityCount++
}

override fun onActivityResumed(activity: Activity) {
    liveActivityCount++
    if (liveActivityCount == 1 && activeActivityCount == 1) {
        iApplicationLifeCycle?.onEnterForeground()
    }
}

override fun onActivityPaused(activity: Activity) {
    liveActivityCount--
}

override fun onActivityStopped(activity: Activity) {
    activeActivityCount--
    if (liveActivityCount == 0 && activeActivityCount == 0) {
        iApplicationLifeCycle?.onEnterBackground()
    }
}

override fun onActivityDestroyed(activity: Activity) {
    aliveActivityCount--
    if (aliveActivityCount == 0) {
        iApplicationLifeCycle?.onLastDestroyed()
    }
}

}

私のアプリケーションで

class MyApplication: IApplicationLifeCycle{

    onCreate() {
        super.onCreate() 
        registerActivityLifecycleCallbacks(AppLifeCycleTracker(this))
    }

    override fun onEnterForeground() {
        Log.i("AppVisibility", "onEnterForeground")
        // do action here
    }

    ...
    ...
    ...
}

オーバーライドされたメソッドで、onEnterForeground必要に応じてアクションを実行するだけです。この場合、初期化を行いたい

于 2020-06-30T16:35:29.083 に答える
-2

イベント onCreate は、オブジェクトの作成中に発生します。onStartの後。アプリが閉じられている場合、オブジェクトはまだメモリ内でアクティブであり、デバイスがさらに空きリソースを必要とする場合に破棄されます。そのため、アプリを再度開くと、onStart イベントのみが発生します。onStart で初期化を移動するか、onStart にチェックなどを入れてみてください。

アクティビティのライフサイクル https://developer.android.com/guide/components/activities/activity-lifecycle

于 2020-06-21T10:29:12.870 に答える