実現したいこと
- Androidのタスク一覧(Recent Apps)に履歴が残らない設定を行ったアプリ(以降、アプリA)で作業途中から復帰する方法
- または作業途中から復帰できてAndroidのタスク一覧(Recent Apps)に履歴が残らない設定方法
前提
現在行っているAndroidのタスク一覧(Recent Apps)に履歴が残らない設定
AndroidManifest.xml内のMainActivityへandroid:excludeFromRecents="true"
を設定
発生している問題・エラーメッセージ
アプリAで作業途中に別アプリを起動させるとアプリAで作業途中の状態に復帰できない
作業途中に復帰できるパターン
- アプリAを起動後、サブ画面ボタンを押下してサブ画面へ遷移する
- 実機のホームボタンを押下してホーム画面へ遷移する
- ホーム画面にあるアプリAのアイコンをタップする
- アプリAのサブ画面が表示される
作業途中に復帰できないパターン
- アプリAを起動後、サブ画面ボタンを押下してサブ画面へ遷移する
- 実機のホームボタンを押下してホーム画面へ遷移する
- アプリA以外の起動していないアプリ(例えばカメラアプリ)を起動する(既に起動させているサードパティアプリでは発生しない)
- 実機のホームボタンを押下してホーム画面へ遷移する
- ホーム画面にあるアプリAのアイコンをタップする
- アプリAのメイン画面(MainActivity)が表示される
該当のソースコード
AndroidManifest.xml
xml
1<?xml version="1.0" encoding="utf-8"?> 2<manifest xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:tools="http://schemas.android.com/tools"> 4 5 <application 6 android:allowBackup="true" 7 android:dataExtractionRules="@xml/data_extraction_rules" 8 android:fullBackupContent="@xml/backup_rules" 9 android:icon="@mipmap/ic_launcher" 10 android:label="@string/app_name" 11 android:roundIcon="@mipmap/ic_launcher_round" 12 android:supportsRtl="true" 13 android:theme="@style/Theme.LearnAndroid" 14 tools:targetApi="35"> 15 16 <activity 17 android:name=".MainActivity" 18 android:excludeFromRecents="true" 19 android:exported="true"> 20 <intent-filter> 21 <action android:name="android.intent.action.MAIN" /> 22 23 <category android:name="android.intent.category.LAUNCHER" /> 24 </intent-filter> 25 </activity> 26 27 <activity 28 android:name=".sub.SubActivity" 29 android:exported="false" /> 30 31 </application> 32 33</manifest>
MainActivity.kt
kotlin
1package com.example.learnandroid 2 3import android.content.Intent 4import android.os.Bundle 5import android.widget.Button 6import androidx.activity.enableEdgeToEdge 7import androidx.appcompat.app.AppCompatActivity 8import com.example.learnandroid.sub.SubActivity 9 10class MainActivity : AppCompatActivity() { 11 12 override fun onCreate(savedInstanceState: Bundle?) { 13 super.onCreate(savedInstanceState) 14 this.enableEdgeToEdge() 15 setContentView(R.layout.activity_main) 16 17 initButtonListener() 18 } 19 20 private fun initButtonListener() { 21 findViewById<Button>(R.id.moveSubScreenButton).apply { 22 setOnClickListener { 23 val intent = Intent(this@MainActivity, SubActivity::class.java) 24 25 startActivity(intent) 26 } 27 } 28 } 29}
activity_main.xml
xml
1<?xml version="1.0" encoding="utf-8"?> 2<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:app="http://schemas.android.com/apk/res-auto" 4 xmlns:tools="http://schemas.android.com/tools" 5 android:id="@+id/main" 6 android:layout_width="match_parent" 7 android:layout_height="match_parent" 8 tools:context=".MainActivity"> 9 10 <Button 11 android:id="@+id/moveSubScreenButton" 12 android:layout_width="wrap_content" 13 android:layout_height="wrap_content" 14 android:text="サブ画面" 15 app:layout_constraintBottom_toBottomOf="parent" 16 app:layout_constraintEnd_toEndOf="parent" 17 app:layout_constraintStart_toStartOf="parent" 18 app:layout_constraintTop_toTopOf="parent" /> 19 20</androidx.constraintlayout.widget.ConstraintLayout>
SubActivity.kt
kotlin
1package com.example.learnandroid.sub 2 3import android.os.Bundle 4import androidx.activity.enableEdgeToEdge 5import androidx.appcompat.app.AppCompatActivity 6import com.example.learnandroid.R 7 8class SubActivity : AppCompatActivity() { 9 10 override fun onCreate(savedInstanceState: Bundle?) { 11 super.onCreate(savedInstanceState) 12 this.enableEdgeToEdge() 13 setContentView(R.layout.activity_sub) 14 } 15}
activity_sub.xml
xml
1<?xml version="1.0" encoding="utf-8"?> 2<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:app="http://schemas.android.com/apk/res-auto" 4 xmlns:tools="http://schemas.android.com/tools" 5 android:id="@+id/main" 6 android:layout_width="match_parent" 7 android:layout_height="match_parent" 8 tools:context=".sub.SubActivity"> 9 10 <TextView 11 android:id="@+id/subScreenTitle" 12 android:layout_width="wrap_content" 13 android:layout_height="wrap_content" 14 android:text="サブ画面" 15 app:layout_constraintBottom_toBottomOf="parent" 16 app:layout_constraintEnd_toEndOf="parent" 17 app:layout_constraintStart_toStartOf="parent" 18 app:layout_constraintTop_toTopOf="parent" /> 19 20</androidx.constraintlayout.widget.ConstraintLayout>
試したこと
タスク一覧に残らない設定によりAndroidOSから優先的にKillされてしまうのではないかと考えております
- 設定アプリからアプリAのバッテリー → 制限なしに設定
→ 改善なし - AndroidManifest.xml内のMainActivityへ
android:excludeFromRecents="true"
を削除
→ 作業途中復帰できるがタスク一覧に履歴が残ってしまうためNG
補足情報(FW/ツールのバージョンなど)
Androidバージョン
- Android 15をターゲットとしています
動作確認環境
- エミュレータ: Pixel7 Pro API34(メモリやストレージなどの設定はデフォルトのまま変更なし)
- Aquos(SHG03)
>AndroidOSから優先的にKillされてしまうのでは
kill もなにも、履歴が無いのなら復帰しようが無いように思いますけども。
コメントありがとうございます!
> kill もなにも、履歴が無いのなら復帰しようが無いように思いますけども。
すみません、コメントいただいた文章で「復帰」と言われているのはどちらでしょうか?
1. アプリAをユーザが見える状態にフロントへ戻すこと
2. アプリAを画面遷移やユーザが入力した状態へ戻すこと
1の場合は、タスク一覧には表示されませんのでタスク一覧からの復帰は不可能ですが、ホーム画面やランチャーからアプリAのアイコンをタップすることで復帰することが可能です
2の場合は、他のアプリ起動を間に挟まない場合はアプリA(画面遷移や何か入力) → ホーム画面 → アプリAをホーム画面からアプリアイコンタップで起動することでアプリAの画面遷移や入力状態は保持された状態で復帰できます
すいません、あまり深く考えてのことではないのですが
>アプリAで作業途中に別アプリを起動させるとアプリAで作業途中の状態に復帰できない
ということに対してです。
間で別アプリを起動するかどうかで復帰出来る出来ないが違うということですが、つまり最後に起動したアプリは(まだ?)"完全な履歴扱いでは無い"という感じなのかもしれません。
何かを知っているわけでも調べたわけでもありませんが、システムの"履歴"を使わないなら、アプリ自身で状態を保存・復帰する処理を行えば良いのではないでしょうか。
回答いただきありがとうございます!
> 何かを知っているわけでも調べたわけでもありませんが、システムの"履歴"を使わないなら、アプリ自身で状態を保存・復帰する処理を行えば良いのではないでしょうか。
私も最終手段は上記しか無いな、と考えておりました、、、;
状態を戻すとなると、ファイルなどに画面遷移履歴や各画面の状態を全て記録しておき、次回のアプリA起動時に画面遷移履歴を付け直しながら各画面の状態も戻して(戻すタイミングは各画面が表示されるときで良いと思いますが)と結構大変なので私の知らない裏技が無いかなと思いこちらへ質問させていただきました(今回のアプリAは質問用に2画面と画面内もシンプルなのですが、もっと複雑なアプリを想定しております)
通常のAndroidアプリと違うことをやろうとするなら自分で面倒見なさいよ、というのはその通りだと思います、がその前にちょっと悪あがきしている状態ですorz
実はこんな設定が…とかあると助かりますよね^^;
チラッと英単語で検索してみましたが多分絞り込みが足りないのかそれらしい記事は当たりませんでした。お力になれず…。
> 実はこんな設定が…とかあると助かりますよね^^;
そうですね、、、何かあると嬉しいです、、、
> お力になれず…。
いえいえ、私の質問に貴重なお時間を割いていただきありがとうございます!

回答1件
あなたの回答
tips
プレビュー