やりたいこと
アプリ間でデータの共有を行いたい
片方のアプリがプロセスKillされている状態でもデータの参照を行えるようにしたい
非推奨だが、SharedUserIDを使って実現できたので、その備忘録
Step1.SharedUserIDとは
アプリA、アプリBを同一UserIdで実行することで、アプリAからアプリBの情報を参照することが可能な機能
UserIDは、"adb shell"でコマンドラインに入った後、"ps -A"コマンドでプロセス一覧を参照
以下の例では、UserIDが"u0_a56"のアプリが2個存在しているのが確認できる
UserIDが同一の場合、アプリAのSharedPrefrenceの内容を、アプリBからも参照することが可能となる
Step2.実装方法
2アプリのパッケージ名を以下とした場合の説明
アプリ名 | パッケージ名 | 概要 |
---|---|---|
アプリA | jp.co.hoge | SharedPrefrenceに書き込み |
アプリB | jp.co.fuga | アプリAのSharedPrefrenceを読み込む |
AndroidManifest.xml(アプリA)
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:sharedUserId="jp.co.hoge"
android:sharedUserMaxSdkVersion="31">
<application
:(略)
AndroidManifest.xml(アプリB)
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:sharedUserId="jp.co.hoge"
android:sharedUserMaxSdkVersion="31">
<application
:(略)
MainActivity.java(アプリA)
protected void onCreate(Bundle savedInstanceState) {
SharedPreferences sharedPref = getSharedPreferences("shared_test_read", Context.MODE_PRIVATE );
SharedPreferences.Editor editor = sharedPref.edit();
editor.putString("test_test", "abcdefg11111");
editor.apply();
:
MainActivity.java(アプリB)
protected void onCreate(Bundle savedInstanceState) {
try {
Context c = createPackageContext("jp.co.hoge", CONTEXT_INCLUDE_CODE);
SharedPreferences share = c.getSharedPreferences("shared_test_read", Context.MODE_PRIVATE);
String readText = share.getString("test_test", "none");
} catch (PackageManager.NameNotFoundException e) {
}
解説
- AndroidManifest.xml(アプリA):sharedUserIdに公開するパッケージ名を記載
- AndroidManifest.xml(アプリB):sharedUserIdに参照するアプリのパッケージ名を記載
- MainActivity.java(アプリA):一般的なSharedPrefrenceの書き込み
- MainActivity.java(アプリB):createPackageContext()でアプリAのコンテキストを取得。以降は、コンテキストでアプリAのSharedPrefrenceにアクセスして読み込む。参照するアプリが見つからない場合は、NameNotFoundExceptionが発生する
最後に
実装量も少なく、また参照先アプリのプロセスがAliveである必要もないことから便利だが、API29から非推奨となっている
ContentProviderを使うのが一般的だと思うが、簡単にできる仕組みとしてのメモ書きです
参考) https://developer.android.com/guide/topics/manifest/manifest-element?hl=ja