如何在一个应用程序之间发送数据到android中的其他应用程序?

时间:2016-07-27 09:06:23

标签: android android-intent android-activity intentfilter

我试图通过Android中的Intent在 App1 之间向 App2 发送数据

我使用了这段代码,但我无法解决我的问题。

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>

6 个答案:

答案 0 :(得分:4)

最终代码:

应用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();

    }
}

清单:

        <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"));

答案 1 :(得分:3)

执行此操作时:

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

您正在调用Intent的单参数构造函数。在此构造函数中,参数被解释为Intent ACTION。然后,在Intent

中设置包名称

当您使用此startActivity()致电Intent时,Android会查找包含指定ACTION的Activity的{​​{1}}。没有安装的应用程序在清单中定义了<intent-filter>这样的内容:

Activity

因此,Android无法找到并启动您想要的<activity> <intent-filter> <action android:name="com.appstore.MainActivity"/> <category android:name="android.intent.category.DEFAULT"/> </intent-filter> </activity>

如果要明确指定要使用的组件,而不是使用单参数Activity构造函数,则应该这样做:

Intent

使用 Intent i2 = new Intent(); i2.setClassName("com.appstore", "com.appstore.MainActivity"); i2.putExtra("Id", "100"); startActivity(i2); 提供要启动的组件的包名称和类名。

答案 2 :(得分:0)

使用Bundle.putSerializable(Key,Object);Bundle.putParcelable(Key, Object); 前一个对象必须实现Serializable,后一个对象必须实现Parcelable

答案 3 :(得分:0)

内容提供商:

内容提供程序是将一个进程中的数据与另一个进程中运行的代码连接的标准接口。

See Android Docs.

内容提供商工作演示here.

答案 4 :(得分:0)

我的要求是将“用户ID”从App1发送到App2 ,然后将“用户名”返回给App1

我需要在没有任何选择器的情况下直接直接启动我的应用。我能够使用隐式意图 startActivityForResult 来实现这一目标。

App1> MainActivity.java

private void launchOtherApp() {
    Intent sendIntent = new Intent();
    //Need to register your intent filter in App2 in manifest file with same action.
    sendIntent.setAction("com.example.sender.login"); // <packagename.login>
    Bundle bundle = new Bundle();
    bundle.putString("user_id", "1111");
    sendIntent.putExtra("data", bundle);
    sendIntent.setType("text/plain");
    if (sendIntent.resolveActivity(getPackageManager()) != null) {
        startActivityForResult(sendIntent, REQUEST_CODE);
    }
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == REQUEST_CODE) {
        if (resultCode == Activity.RESULT_OK) {
            Bundle bundle = data.getBundleExtra("data");
            String username = bundle.getString("user_name");
            result.success(username);
        }
    } else {
        super.onActivityResult(requestCode, resultCode, data);
    }
}

我在App2中有两项活动,即。 MainActivity和LoginActivity。

App2> AndroidManifest.xml

<activity android:name=".LoginActivity">
    <intent-filter>
        <!--The action has to be same as App1-->
        <action android:name="com.example.sender.login" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="text/plain" />
    </intent-filter>
</activity>

抱歉,我对Java和Kotlin有点困惑。我的第二个应用程序是在Kotlin中进行的,并不是说它会以任何方式起作用。

App2> LoginActivity.java

override fun onResume() {
    super.onResume()
    var userId = "No data received"
    val intent = intent
    if (intent != null
        && intent.action != null
        && intent.action.equals("com.example.sender.login")
    ) {
        val bundle = intent.getBundleExtra("data")
        if (bundle != null) {
            userId = bundle.getString("user_id")
            userId = " User id is $userId"
        }
    }
    tvMessage.text = "Data Received: $userId"
}

fun onClickBack(view: View) {
    val intent = intent
    val bundle = Bundle()
    bundle.putString("sesion_id", "2222")
    intent.putExtra("data", bundle)
    setResult(Activity.RESULT_OK, intent)
    finish()
}

答案 5 :(得分:0)

这应该有效:

APP1

    Intent i2 = new Intent();
    i2.setComponent(new ComponentName(PACKAGE,ACTIVITY));//the destination packageName
    i2.putExtra("Id", "100");
    startActivity(i2);
    

APP2

    String myString = getIntent().getStringExtra("Id");