如何在Android中将数据从一个应用程序传输到另一个应用程序

3

我有两个应用程序,com.appone.onecom.apptwo.two

我想从appone传输数据到apptwo,当数据传输到apptwo时,我希望apptwo打开或仅仅展示数据(在onResume方法中)。我写了这段代码:

com.appone.one:

 Intent i = new Intent(Intent.ACTION_DATE_CHANGED);
                    PackageManager manager = getPackageManager();
                    i = manager.getLaunchIntentForPackage("com.apptwo.two");
                    i.putExtra("MessageText",""+Connect.MessageArrive.toString());
                   i.addCategory(Intent.CATEGORY_LAUNCHER); 
startActivity(i);

com.apptwo.two:

@Override
    public void onResume() {
        super.onResume();
        String name=getIntent().getStringExtra("MessageText");
        Toast.makeText(getApplicationContext(),String.valueOf(name), Toast.LENGTH_LONG).show();
    }  

我想只写这一行:

String name=getIntent().getStringExtra("MessageText");

onResume中,因为我不想让apptwo再次加载,如果我将这一行代码写在onCreate中,我的代码可以正常工作。但我希望在onResume实现这个功能。 现在apptwo返回空值:(

我该怎么办呢? 提前感谢您的帮助。


不行,我现在测试了一下那篇文章,没有效果。 - Bahar Azartoos
7个回答

3
你可以使用内容提供者在应用之间共享数据。你可以从下面的链接了解有关内容提供者的更多信息。

http://developer.android.com/guide/topics/providers/content-providers.html

注意:如果我没记错,要在应用之间使用内容提供者传递数据,你需要使用相同的密钥库签署应用。
你也可以使用意图将数据传递到你的应用程序中。你可以从下面检查它。

http://developer.android.com/training/sharing/send.html

虽然不是一个好的实践,但你可以使用共享首选项。

SharedPreferences preferences = getSharedPreferences(PREF_NAME, MODE_WORLD_READABLE);

1
ContentProviders的替代方案是简单的Intents或(绑定)服务。 - F43nd1r

1
第三种,也可能更好的方法是使用协议或自定义URI方案。默认情况下,这是Android应用程序发送和接收数据的方式。例如,当您通过电子邮件收到一个URL链接时,该应用程序将打开默认的浏览器应用程序。这是因为浏览器已向操作系统注册,可以处理与Web URI模式匹配的URI。请参见附加链接。

http://developer.android.com/training/basics/intents/filters.html


我同意。这个解决方案在实现上是最简单的。 - Igor SKRYL

0

我通过这个链接解决了我的问题: http://androiddhamu.blogspot.in/2012/03/share-data-across-application-in.html

appone:

  SharedPreferences prefs = getSharedPreferences("demopref",
                             Context.MODE_WORLD_READABLE);
                     SharedPreferences.Editor editor = prefs.edit();
                     editor.putString("demostring", ""+Connect.MessageArrive.toString());
                     editor.commit();

                  Intent i = new Intent(Intent.ACTION_DATE_CHANGED);
                    PackageManager manager = getPackageManager();
                    i = manager.getLaunchIntentForPackage("com.graphhopper.android");
                   // i.putExtra("MessageText",""+Connect.MessageArrive.toString());
                   i.addCategory(Intent.CATEGORY_LAUNCHER); 


                  //i.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
                    startActivity(i);

apptwo:

  @Override
    public void onResume() {
        super.onResume();
            con = createPackageContext("com.appone.one", 0);
            SharedPreferences pref = con.getSharedPreferences(
                    "demopref", Context.MODE_PRIVATE);
            String data = pref.getString("demostring", "No Value");
}

1
MODE_WORLD_READABLE在API 17中已经被弃用,并且在API 24中已经完全从Android中删除,请不要依赖它。 - Harkal
MODE_WORLD_READABLE已被弃用。如果您使用它,将会出现SecurityException异常。 - Velayutham M

0

在实现过程中需要注意以下几点:

  1. 有两个应用程序,App1和App2。我们需要从APP1向APP2发送数据,当APP2完成后,我们需要将数据从APP2发送回APP1。

步骤: -- 在想要进行通信的活动中,将android:exported =“true”添加到两个应用程序清单中。

在App 1中

private void launchApp2() {
    Intent intent = new Intent();
    //Need to register your intent filter in App2 in manifest file with same action.
    intent.setAction("com.example.app2.main"); // <packagename.main>
    Bundle bundle = new Bundle();
    bundle.putString("name", "ABC");
    intent.putExtra("data", bundle);
    intent.setType("text/plain");
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivityForResult(sendIntent, 101);
    } else {
    Log.d("App not installed")
    }
}

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

在 App2 的清单文件中,
<activity android:name=".main">
    <intent-filter>    
        <!--The action has to be same as App1-->        
        <action android:name="com.example.app2.main" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="text/plain" />
    </intent-filter>
</activity>

要在App2中获取数据,

public getData (){
 Intent intent = new Intent();
 Bundle bundle = intent.getBundleExtra("data");
 String name = bundle.getString("name");
}

将数据发送回App1。
public sendData(){
Intent intent = new Intent();
 Bundle bundle = new Bundle();
 bundle.putString("name", "ABC");
 intent.putExtra("data", bundle)
 setResult(Activity.RESULT_OK, intent)
 finish()
}

0

这两个应用程序都是您自己的,因此可以轻松制作。

1)通过使用共享首选项,您可以在移动设备中保存来自app1的数据,并获取该数据并在app2中使用,反之亦然。

SharedPreferences仅适用于小型数据。

2)内容提供程序可以实现您所需的功能。只有在需要在多个应用程序之间共享数据时才需要内容提供程序。

http://developer.android.com/guide/topics/providers/content-providers.html

在你的情况下,你的应用必须是一个内容提供者。请参考你所询问的内容:http://www.compiletimeerror.com/2013/12/content-provider-in-android.html#.Vwsy1vl97IU

非常感谢,我使用了共享首选项。 - Bahar Azartoos

0
使用Intent和BroadCastReceiver在应用程序之间传递数据。
在您的appOne中创建:
1)在特定事件调用sendBroadcast(Intent)时,在appOne活动中创建动态广播接收器。
不要像上面提到的那样调用活动。在appTwo中注册一个带有某些操作的广播接收器,并从appOne发送具有与appTwo中指定操作相同的广播意图。因此,当您从appOne触发sendbradcast(Intent)时,正在侦听该意图的appTwo将触发,然后您可以调用appTwo的Activity(即MainActivity)。在appTwo的onReceive方法中检查您的活动是否处于活动状态(如果活动处于活动状态,则从appTwo发送Broadcast(Intent)以刷新appTwo中的消息;否则调用Activty)。
现在在您的appTwo中创建:
1)静态BroadCastReceiver在manifest中接收带有某些操作的意图,当应用程序未打开时。
2)如果应用程序已打开,则在appTwo活动中创建动态广播接收器以刷新消息。

-2

使用Shared Preferences,并设置模式为MODE_WORLD_READABLE

SharedPreferences sPref = activity.getPreferences(Activity.MODE_WORLD_READABLE);

在Preference中保存数值:


非常感谢:我使用了这个链接 http://androiddhamu.blogspot.in/2012/03/share-data-across-application-in.html ,我的问题得到了解决。 - Bahar Azartoos
为什么即使答案是正确的或被接受的,人们还会给它点踩? - Rakshit Nawani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接