2017-08-01 2 views
2

J'ai deux applications (A, B) que je veux relier entre eux. Lorsque l'utilisateur est dans l'application A, en cliquant sur un bouton, je veux ouvrir l'application B et lui envoyer des données.Comment utiliser putExtra pour ouvrir une autre application et lui envoyer des données?

J'ai utilisé cette méthode dans l'application A pour aller application B et envoyer des données à l'application B:

public static boolean openApp(Context mContext, String packageName) { 
    PackageManager manager = context.getPackageManager(); 
    Intent goToEncyclopedia = manager.getLaunchIntentForPackage(packageName); 
    if (goToEncyclopedia == null) { 
     return false; 
    } 
    goToEncyclopedia.addCategory(Intent.CATEGORY_LAUNCHER); 
    goToEncyclopedia.putExtra("NAME" , "Ehsan"); 
    context.startActivity(goToEncyclopedia); 

    return true; 
} 

et je l'appelle comme ça dans l'application A:

openApp(mContext, "encyclopedia.rasad.app.codenevisha.com.encyclopedia"); 

Quand j'appelle cette méthode va ouvrir l'application B mais les données que je veux envoyer avec putExtra ne seront pas envoyées.

Et voici mon code dans l'App B pour recevoir des données de l'intention:

Bundle bundle = getIntent().getExtras(); 
if (bundle != null){ 
    String name = bundle.getString("NAME"); 
    Log.i("EXTRAS", name); 
} 
+0

que je vois, vous envoyer une intention de lanceur au paquet . Essayez d'envoyer une intention directement à l'activité. C'est peut-être pourquoi vos données se perdent quelque part. –

+0

lorsque je change directement l'intention en activité, même l'application B ne s'ouvre pas – Ehsan

+0

poster votre manifeste s'il vous plaît –

Répondre

3

Ajouter filtre intention dans l'application B:

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

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 

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

données passer de l'application A:

 Intent intent = new Intent("com.yourpackage.action"); 
     intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     intent.putExtra("data","data string"); 
     startActivity(intent); 

extraient des données de l'application B:

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     getIntent().getStringExtra("data"); 
    } 
+1

Merci pour votre solution simple, cela fonctionne très bien – Ehsan

+0

son fonctionne parfois, mais parfois non, pourquoi? –

1

Réponse 1

Dans App A utiliser Bundle pour envoyer des données à l'App B

Bundle bundle = new Bundle(); 
bundle.putString("NAME" , "Ehsan"); 
goToEncyclopedia.putExtras(bundle); 

Réponse 2

Supprimer sous la ligne de code

goToEncyclopedia.addCategory(Intent.CATEGORY_LAUNCHER); 

code final sera App A

Intent sendIntent = getPackageManager().getLaunchIntentForPackage("com.example.app2"); 
sendIntent.putExtra("NAME", "Ehsan"); 
startActivity(sendIntent); 

App B

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Intent intent = getIntent(); 

if (intent.hasExtra("NAME")) { 
     String name = intent.getStringExtra("NAME"); 

} 
+0

Merci pour votre réponse, Mais ça ne marche pas! – Ehsan

+0

quelle réponse n'a pas fonctionné? –

+1

J'ai essayé vos deux moyens, ils n'ont pas fonctionné! – Ehsan