LoginSignup
2
1

【Android/Java】アプリ間データ共有(Android11)

Posted at

やりたいこと

アプリ間でデータの共有を行いたい
片方のアプリがプロセスKillされている状態でもデータの参照を行えるようにしたい

非推奨だが、SharedUserIDを使って実現できたので、その備忘録

Step1.SharedUserIDとは

アプリA、アプリBを同一UserIdで実行することで、アプリAからアプリBの情報を参照することが可能な機能
UserIDは、"adb shell"でコマンドラインに入った後、"ps -A"コマンドでプロセス一覧を参照
以下の例では、UserIDが"u0_a56"のアプリが2個存在しているのが確認できる
無題.png

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) {
    }

解説

  1. AndroidManifest.xml(アプリA):sharedUserIdに公開するパッケージ名を記載
  2. AndroidManifest.xml(アプリB):sharedUserIdに参照するアプリのパッケージ名を記載
  3. MainActivity.java(アプリA):一般的なSharedPrefrenceの書き込み
  4. MainActivity.java(アプリB):createPackageContext()でアプリAのコンテキストを取得。以降は、コンテキストでアプリAのSharedPrefrenceにアクセスして読み込む。参照するアプリが見つからない場合は、NameNotFoundExceptionが発生する

最後に

実装量も少なく、また参照先アプリのプロセスがAliveである必要もないことから便利だが、API29から非推奨となっている

ContentProviderを使うのが一般的だと思うが、簡単にできる仕組みとしてのメモ書きです
 
 
参考) https://developer.android.com/guide/topics/manifest/manifest-element?hl=ja

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1