Android STOP状態について

 

2018年07月27日 Android
Android STOP状態について

このページでは、AndroidにおけるアプリのSTOP状態の説明、状態の管理方法、状態が変化するパターンについて説明します。

 

目次

  1. STOP状態とは
  2. STOP状態変化について

STOP状態とは

  • STOP状態は、Androidアプリの状態です。Activityの状態ではありません。
  • STOP状態は、Android3.1から追加されました(Android 3.1 APIs Launch controls on stopped applications)。
  • STOP状態は、バックグランドプロセスや他アプリからの起動を制御するために使用されます。

 

STOP状態が行っている制御とは

  • アプリがSTOP状態である場合、他アプリからのIntentを受信することができません。
  • 例外として、以下のケースの場合はIntentを受信することができます。
    • 明示的Intent
    • Intent.FLAG_INCLUDE_STOPPED_PACKAGES」フラグが付与されている暗黙的Intent
  • Intentの送信方法が、Context#startActivity()、Context#startService()、Context#sendBroadcast()、等のいずれの方法かは関係ありません。

 

STOP状態アプリの管理方法について

Android OS(各アプリから発出されたIntentを処理する部分)は、Androidユーザ毎に、各アプリのSTOP状態を(XML形式の)設定ファイル上で管理しています。以下は、設定ファイルの記述内容例です。値は、エミュレータ「Nexus4 API 22」のデフォルト値の抜粋です。

/data/system/users/0/package-restrictions.xml
<package-restrictions>
  <pkg name="com.android.smoketest" stopped="true" nl="true" />
  <pkg name="com.example.android.livecubes" stopped="true" nl="true" />
  <pkg name="com.google.android.gm">
    <enabled-components>
      <item name="com.google.android.gm.widget.GmailWidgetProvider" />
      <item name="com.google.android.gm.ComposeActivityGmail" />
      <item name="com.google.android.gm.CreateShortcutActivityGmail" />
    </enabled-components>
    <disabled-components>
      <item name="com.google.android.gm.widget.GoogleMailWidgetProvider" />
      <item name="com.android.email.service.EasAuthenticatorServiceAlternate" />
      <item name="com.android.email.service.EmailUpgradeBroadcastReceiver" />
      <item name="com.android.email.service.LegacyEmailAuthenticatorService" />
      <item name="com.android.email.service.LegacyEasAuthenticatorService" />
      <item name="com.google.android.gm.CreateShortcutActivityGoogleMail" />
      <item name="com.android.email.service.EasAuthenticatorService" />
      <item name="com.android.email.service.AttachmentService" />
    </disabled-components>
  </pkg>
  <pkg name="com.android.sdksetup">
    <disabled-components>
      <item name="com.android.sdksetup.DefaultActivity" />
    </disabled-components>
  </pkg>
  <pkg name="com.example.android.apis" stopped="true" nl="true" />
  <pkg name="com.android.inputmethod.latin">
    <disabled-components>
      <item name="com.android.inputmethod.latin.setup.SetupActivity" />
    </disabled-components>
  </pkg>
  <pkg name="com.google.android.calendar">
    <disabled-components>
      <item name="com.android.calendar.RingtoneUpgradeReceiver" />
      <item name="com.android.calendar.SyncUpgradeReceiver" />
      <item name="com.android.calendar.AllPrefsUpgradeReceiver" />
    </disabled-components>
  </pkg>
  <pkg name="com.android.settings">
    <disabled-components>
      <item name="com.android.settings.CryptKeeper" />
    </disabled-components>
  </pkg>
  <pkg name="com.android.gesture.builder" stopped="true" nl="true" />
  <pkg name="com.android.smoketest.tests" stopped="true" nl="true" />
  <pkg name="com.example.android.softkeyboard" stopped="true" nl="true" />
  <pkg name="com.android.widgetpreview" stopped="true" nl="true" />
  <preferred-activities>
    <item name="com.android.mms/.ui.ComposeMessageActivity" match="200000" always="true" set="2">
      <set name="com.android.mms/.ui.ComposeMessageActivity" />
      <set name="com.example.android.apis/.os.SmsMessagingDemo" />
      <filter>
          <action name="android.intent.action.SENDTO" />
          <cat name="android.intent.category.DEFAULT" />
          <scheme name="smsto" />
      </filter>
    </item>
    <item name="com.android.mms/.ui.ComposeMessageActivity" match="200000" always="true" set="3">
      <set name="com.android.mms/.ui.ComposeMessageActivity" />
      <set name="com.example.android.apis/.os.SmsMessagingDemo" />
      <set name="com.android.fallback/.Fallback" />
      <filter>
          <action name="android.intent.action.SENDTO" />
          <cat name="android.intent.category.DEFAULT" />
          <scheme name="sms" />
      </filter>
    </item>
  </preferred-activities>
  <persistent-preferred-activities />
  <crossProfile-intent-filters />
</package-restrictions>

 

以下は、上記の設定ファイルについての説明です。

  • 本ファイルは、ユーザ毎に作成されます。
  • 本ファイルの中には、STOP状態であるインストール済アプリ一覧の記述が含まれています。
  • 本ファイルのフルパスは、/data/system/users/■/package-restrictions.xmlです。■の部分はAndroidユーザ毎に異なります。例えば「0」などです。
  • stopped属性が“true”となっている<pkg>タグが、「STOP状態のアプリ」を表しています。
  • 該当アプリが起動するとSTOP状態ではなくなり、<pkg>タグの記述が消えます(消えるまでタイムラグがあります)。
  • STOP状態管理は定常的にはメモリ上で行われていますが、端末が再起動した場合、このファイルを参照してSTOP状態管理を復元します。
  • ちなみにnl属性が“true”となっているものは、「インストールされてから未起動のアプリ」を表しています。

 

STOP状態変化について

ここでは「STOP状態になる動作」、「STOP状態にならない動作」について説明します。

STOP状態になる動作

  • アプリの初回インストール時(初期状態はSTOP状態)
  • システム設定アプリ → アプリケーション → 対象アプリ → 「強制終了」ボタンを押下時
  • ADBコマンドで強制停止(adb shell am force-stop[対象パッケージ]コマンド)

 

STOP状態にならない動作

  • アプリのアップデート時
  • アプリのプロセスキル時(adb shell ps [対象アプリのPID] コマンド)

 

 

 

 

Programming Style