2016-07-27 21 views
1

Ich habe versucht, Daten zwischen App1 zu App2 über Intent in AndroidWie Daten zwischen einer Anwendung an andere Anwendung in Android senden?

ich diesen Code auf das Senden verwendet, aber ich konnte mein Problem nicht lösen.

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

Nutzen Sie [Content Provider] (https://developer.android.com/guide/topics/providers/content-providers.html), um Daten zwischen Anwendung senden. – Arshak

+1

@Arshak Content Provider ist wahrscheinlich zu viel Aufwand, um eine 'String' von einer' Activity' zu einer anderen zu senden. –

Antwort

0

Mit Bundle.putSerializable(Key,Object); und Bundle.putParcelable(Key, Object); das ehemalige Objekt mussimplementieren 0, und das letztere Objekt muss Parcelable implementieren.

+0

wie Bündel Bundle.putSerializable setzen (Key, Object); Innere Absicht? – Farzad

+0

Weil 'String'' Serializable' implementiert hat, 'i2.putExtra (" Id "," 100 ");' ist in Ordnung. Um jedoch eine explizite Aktivität zu starten, verwenden Sie 'i2.setClassName (" com.appstore "" com.appstore.MainActivity "); stattdessen. – samm

0

Content-Provider:

Content-Provider sind die Standard-Schnittstelle, die Daten in einem Prozess verbindet mit dem Code in einem anderen Prozess ausgeführt wird.

See Android Docs.

Inhalt Anbieter arbeiten Demo here.

+0

Ich finde dieses Beispiel. http://infobloggall.com/2015/04/14/communication-between-two-applications-in-android-using-messenger/ – Farzad

+0

@Farzad das ist auch cool. –

2

Wenn Sie dies tun:

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

Sie den Single-Argument Konstruktor Intent nennend. In diesem Konstruktor wird das Argument als Intent ACTION interpretiert. Sie legen dann den Paketnamen in Intent fest.

Wenn Sie startActivity() mit diesem Intent nennen, werden Android für eine Activity suchen, die eine <intent-filter> mit dem angegebenen Aktion enthält. Es sind keine installierten Anwendungen, die eine Activity wie dies im Manifest definiert haben:

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

So Android nicht in der Lage sein zu finden, und starten Sie die Activity, die Sie wollen.

Wie Sie explizit die Komponente festlegen möchten, die Sie verwenden möchten, anstatt die 1-Argument Intent Konstruktor, sollten Sie dies tun, anstatt:

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

setClassName() Mit Ihnen den Paketnamen und die Klassenname der Komponente, die Sie starten möchten.

+0

Ihr Code andere Anwendung ausführen und keine Daten senden – Farzad

+0

Sie müssen erklären, was Sie mit "Daten senden" meinen. Welche Daten möchten Sie senden? –

2

Endcode:

App 1:

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

App 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(); 

    } 
} 

Manifest:

<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

Dies kann für Sie arbeiten, aber Sie haben viel zu viel Zeug hier und Sie verstehen wahrscheinlich nicht, warum Ihr Code funktioniert. Wenn Sie im Manifest einen '' deklariert haben, müssen Sie nicht exported = "true" angeben, da dies der Standardwert ist, müssen Sie nicht "enabled =" true angeben "' da standardmäßig alle Komponenten aktiviert sind. Zweitens müssen Sie, wenn Sie im Manifest einen '' angeben, den 'BroadcastReceiver' nicht durch Aufrufen von 'registerReceiver()' registrieren. Du tust ** entweder das eine oder das andere, nicht beides **. –

+2

Drittens sind sowohl Ihre '' Deklaration im Manifest als auch Ihre Verwendung von 'IntentFilter' in' registerReceiver() 'nutzlos, weil Sie niemals eine Sendung' Intent' senden, die die ACTION "first_app_packagename" enthält. Viertens müssen Sie, da Sie die Komponente 'Intent' mit' setClassName() 'explizit auf COMPONENT setzen, die Aktion in der Sendung' Intent' nicht einstellen. Das ist auch nutzlos. –

+1

Ich habe eine App, wo ich, wenn ich die DECLINE BTN drücke, App1 problemlos an App2 sendet und einen Toast ausgibt. Aber was ich tun muss, ist zu einer anderen Tätigkeit zu beabsichtigen, nachdem Toast gesehen worden ist ... Ich versuchte, es in MyBroadcastReceiver nach dem Toast zu tun .. aber ich habe gerade Fehler ... kann Konstruktor ... – LizG