2016-07-27 22 views
1

私はこのコードを使用するが、私は私の問題を解決できませんでしたアンドロイド1つのアプリケーションと他のアプリケーションとの間でアンドロイドでデータをやりとりする方法は?

でテントを経由してApp2のApp1のの間でデータを送信しようとしました。

App1のMainActivity:

 Intent i2 = new Intent("com.appstore.MainActivity"); 
     i2.setPackage("com.appstore");//the destination packageName 
     i2.putExtra("Id", "100"); 
     startActivity(i2); 

App2のMainActivity:

Bundle data = getIntent().getExtras; 
if(data!=null){ 
    String myString = b.getString("Id"); 

} 

Manfiest App2のMainActivity:

<activity android:name=".MainActivity"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 

      <intent-filter> 
       <action android:name="android.intent.action.SEND" /> 
       <category android:name="android.intent.category.DEFAULT" /> 
       <data android:mimeType="image/*" /> 
      </intent-filter> 
      <intent-filter> 
       <action android:name="android.intent.action.SEND" /> 
       <category android:name="android.intent.category.DEFAULT" /> 
       <data android:mimeType="text/plain" /> 
      </intent-filter> 
      <intent-filter> 
       <action android:name="android.intent.action.SEND_MULTIPLE" /> 
       <category android:name="android.intent.category.DEFAULT" /> 
       <data android:mimeType="image/*" /> 
      </intent-filter> 

     </activity> 
+1

アプリケーション間でデータを送信するには、[Content Providers](https://developer.android.com/guide/topics/providers/content-providers.html)を使用してください。 – Arshak

+1

@Arshakのコンテンツプロバイダはおそらく、一つの 'Activity'から' String'を 'String'を別のものに送るのは残念です。 –

答えて

0

元のオブジェクトが実装しなければならないBundle.putSerializable(Key,Object);Bundle.putParcelable(Key, Object); を使用してSerializableであり、後者のオブジェクトはParcelableを実装する必要があります。

+0

バンドルを入れる方法Bundle.putSerializable(Key、Object);内部の意図? – Farzad

+0

'String'は' Serializable'を実装しているので、 'i2.putExtra(" Id "、" 100 ");はOKです。しかし、明示的なアクティビティを開始するには、 'i2.setClassName(" com.appstore "" com.appstore.MainActivity ");を使用します。代わりに。 – samm

0

コンテンツプロバイダ:

コンテンツプロバイダは、コードが別のプロセスで実行している一つのプロセスにデータを接続する標準インタフェースです。

See Android Docs.

コンテンツプロバイダワーキングデモhere.

+0

この例が見つかりました。 http://infobloggall.com/2015/04/14/communication-between-two-applications-in-android-using-messenger/ – Farzad

+0

@Farzad thatsもクールです。 –

2

あなたがこれを行うとき:

Intent i2 = new Intent("com.appstore.MainActivity"); 
    i2.setPackage("com.appstore");//the destination packageName 
    i2.putExtra("Id", "100"); 
    startActivity(i2); 

をあなたはIntentの単一引数のコンストラクタを呼び出しています。このコンストラクタでは、引数はIntent ACTIONと解釈されます。その後、Intentにパッケージ名を設定します。

IntentstartActivity()と電話すると、指定されたACTIONの<intent-filter>を含むActivityが検索されます。マニフェストに次のように定義されたActivityを持って何もインストールされているアプリケーションがありません:

<activity> 
    <intent-filter> 
     <action android:name="com.appstore.MainActivity"/> 
     <category android:name="android.intent.category.DEFAULT"/> 
    </intent-filter> 
</activity> 

だから、Androidが見つけ、あなたが望むActivityを起動することはできません。あなたの代わりに1引数Intentのコンストラクタを使用しての、明示的に使用するコンポーネントを指定したいと

、あなたの代わりにこれを行う必要がある。

Intent i2 = new Intent(); 
    i2.setClassName("com.appstore", "com.appstore.MainActivity"); 
    i2.putExtra("Id", "100"); 
    startActivity(i2); 

あなたはパッケージ名を提供し、setClassName()の使い方起動するコンポーネントのクラス名。

+0

あなたのコードは他のアプリケーションを実行し、データを送信しません – Farzad

+0

「データを送信する」という意味を説明する必要があります。どのデータを送信しますか? –

2

ファイナルコード:

アプリ1:

Intent intent = new Intent(); 
     intent.setClassName("com.appstore", "com.appstore.MyBroadcastReceiver"); 
     intent.setAction("com.appstore.MyBroadcastReceiver"); 
     intent.putExtra("KeyName","code1id"); 
     sendBroadcast(intent); 

アプリ2:

Reciver: 
public class MyBroadcastReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     Toast.makeText(context, "Data Received from External App", Toast.LENGTH_SHORT).show(); 

    } 
} 

マニフェスト:

<receiver 
      android:name=".MyBroadcastReceiver" 
      android:enabled="true" 
      android:exported="true"> 
      <intent-filter> 
       <action android:name="first_app_packagename" /> 
      </intent-filter> 
     </receiver> 

MainActivity:

MyBroadcastReceiver mReceiver = new MyBroadcastReceiver(); 
     registerReceiver(mReceiver, 
       new IntentFilter("first_app_packagename")); 
+2

これはあなたにとってはうまくいくかもしれませんが、ここにはあまりにも多くのものがあり、おそらくあなたのコードがなぜ機能するのか分からないでしょう。まず、マニフェストで ''が宣言されている場合、 'exported =" true "'を指定する必要はありません。これはデフォルトであるため、 'enabled =" trueを指定する必要はありませんデフォルトでは、すべてのコンポーネントが有効になっているためです。第2に、マニフェストに ''を指定した場合、 'registerReceiver()'を呼び出すことによって 'BroadcastReceiver'を登録する必要はありません。あなたは**どちらか一方を、どちらも**両方ではありません**。 –

+2

第3に、マニフェストの '宣言と' registerReceiver() 'の' IntentFilter'の両方の使用は役に立たない。なぜなら、ACTION "first_app_packagename"を含む放送の 'Intent'を実際に送ることはないからです。第4に、 'setClassName()'を使ってブロードキャスト 'Intent 'にCOMPONENTを明示的に設定するので、放送の' Intent'にACTIONを設定する必要はありません。それはまた役に立たない。 –

+1

私は、DECLINE btnを押すと、App1が問題なくApp2にデータを送信し、トーストを提示するアプリがあります。しかし、私がする必要があることは、トーストが見られた後、別のアクティビティを意図することです。私はトーストの後にMyBroadcastReceiverでそれをやろうとしました...しかし、私はちょうどエラーを受け取りました...コンストラクタを解決できません... – LizG

関連する問題