2013-09-23 2 views
6

Какой самый простой способ для передать переменные строки из одного приложения в другое, а также вернуть значения обратно? У меня есть доступ к исходному коду обоих приложений, но это должно быть два разных приложения.Как передавать данные между различными приложениями Android?

Я попытался с startActivityForResult, но это только кажется, что работает между действиями одного и того же приложения. При вызове операции из другого пакета startActivityForResult немедленно возвращает RESULT_CANCELED. Кажется, есть возможность разрешить это с помощью Сервиса, но разве это не слишком просто для некоторых строк?

Есть ли простой и чистый способ сделать это?

Вот код я пытался использовать для startActivityForResult:

//App A: 
      Intent intent = new Intent(); 
      intent.setAction("com.example.testapp.MESSAGE"); 
      Bundle b = new Bundle(); 
      b.putString("loginToken", "263bhqw3jhf6as4yf8j0agtz8h2hj2z9j3hg3g3ggh34uzh2h2ui78h3i9wdnj89x"); 
      intent.putExtra("MyData", b); 

      startActivityForResult(intent, TEST_REQUEST); 

    @Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    Log.d("pairing", "onActivityResult called"); 
    // Check which request we're responding to 
    if (requestCode == TEST_REQUEST) { 
     // Make sure the request was successful 
     Log.d("pairing", "got result, resultCode: " + resultCode); 
     if (resultCode == RESULT_OK) { 
      // The Intent's data Uri identifies which contact was selected. 
      if (data.hasExtra("returnMessage")) { 
       Toast.makeText(this, data.getExtras().getString("returnMessage"), Toast.LENGTH_LONG).show(); 
      } 

     } 
    } 
} 


      // App B: 
     Intent result = new Intent(); 
     Bundle b = new Bundle(); 
     b.putString("returnValue", "this is the returned value"); 
     result.putExtra("MyData", b); 
     setResult(Activity.RESULT_OK, result); 
     Log.d("pairing", "RESULT_OK set"); 
     finish(); 


//App B Manifest 
     <activity 
     android:name="com.example.testapp" 
     android:launchMode="singleTop" 
     android:screenOrientation="portrait" 
     android:windowSoftInputMode="adjustPan" > 
     <intent-filter> 
      <action android:name="com.example.testapp.MESSAGE" /> 

      <category android:name="android.intent.category.DEFAULT" /> 

      <data android:mimeType="text/plain" /> 
     </intent-filter></activity> 

Кто-нибудь видел ошибку? App B всегда возвращается немедленно RESULT_CANCELED

EDIT: Прямо сейчас я не буду получать android.content.activitynotfoundexception никакой активности найдено обрабатывать намерение {акт = com.example.testapp.MESSAGE (имеет дополнительные услуги)} ошибка , Что я делаю не так?

+1

вы можете разместить код двух видов деятельности? –

+0

startActivityForResult должен работать ... Проблема, кажется, в вашем коде – Selvin

+0

Мне кажется, что это невозможно с startActivityForResult(). Он работает между действиями одного и того же приложения, даже с разными пакетами, но не с двумя разными Приложениями. См. [Link] (http: // stackoverflow.com/questions/11919259/how-to-get-startactivityforresult-on-external-activity-to-work) – qefzec

ответ

1

вы можете использовать ContentProvider. Это лучший способ, чем другие.

+0

Мне кажется, что мне грустно, что я должен настроить ContentProvider для отправки двух или трех строк назад. Однако это, по-видимому, самое элегантное решение. – qefzec

+0

Это просто способ предложить вам. вы также можете попробовать другие ответы. sharedpreference также является хорошим способом. это зависит от ваших требований, что и как вы собираетесь использовать. спасибо – Ranjit

0

SharedPreferences может помочь вам в этом отношении.

+0

Хм бы это было чистый способ передачи данных (не нужно хранить)? Так просто объявите SharedPreference в одном приложении и используйте его для обоих приложений? – qefzec

+0

Данные будут _stored_ локально, если вы используете [SharedPreferences] (http://developer.android.com/reference/android/content/SharedPreferences.html). Для любого конкретного набора предпочтений есть один экземпляр этого класса что все клиенты делятся. Так что модифицировано один раз, измененное значение отражается везде. Это способ доступа к данным. Я предпочитаю это, а не передачу данных (с использованием намерения, putExtra и т. д.). –

0

У меня есть два приложения, которые я передаю в/из.

App1... 
Intent i = new Intent("com.xxx.yyy.MESSAGE"); 
Bundle b = new Bundle(); 
b.putString("AAA", getAAA()); 
i.putExtra("MyData", b); 
startActivityForResult(i, "myProcess"); 

Ничего особенного там ...

App2 ... в onResume() ...

Intent i = getIntent(); 
if (i != null && i.getAction().equals("com.xxx.yyy.MESSAGE") { 
    ...get the data from the bundle 
} 

отмечают, что AndroidManifest.xml (для App2) имеет следующие данные для одного из деятельность

<intent-filter> 
    <action android:name="com.xxx.yyy.MESSAGE"/> 
    <category android:name="android.intent.category.DEFAULT"/> 
    <data android:mimeType="text/plain"/> 
</intent-filter> 
+0

Это работает, когда вы передаете данные в App2, но вы не можете передать что-то обратно, можете ли вы? Когда я это пробовал, событие RESULT_CANCELED at onActivityResult вернулось сразу – qefzec

+0

да ... я воздействую на данные (в App2) и передаю его обратно в App1. опять же, в связке ... я отключил свою машину dev, поэтому не могу вспомнить точный способ, которым я это сделал ... но это «стандартный» (в документах). App1 выбирается в 'onActivityResult (xxx, yyy, data)' –

+0

app1 и app2 не находятся в одном пакете? Я пробовал свой путь, но это не работает для меня. Я предоставлю свой код выше – qefzec

0

Вы можете обмениваться гонцами между двумя службами, которые принадлежат к этим приложениям (даже если приложения из двух разных пакетов) и общаться с помощью этих мессенджеров.

0
public class MyParcelable implements Parcelable { 
    // You can include parcel data types 
    private int mData; 
    private String mName; 

    // We can also include child Parcelable objects. Assume MySubParcel is such a Parcelable: 
    private MySubParcelable mInfo; 

    // This is where you write the values you want to save to the `Parcel`. 
    // The `Parcel` class has methods defined to help you save all of your values. 
    // Note that there are only methods defined for simple values, lists, and other Parcelable objects. 
    // You may need to make several classes Parcelable to send the data you want. 
    @Override 
    public void writeToParcel(Parcel out, int flags) { 
     out.writeInt(mData); 
     out.writeString(mName); 
     out.writeParcelable(mInfo, flags) 
    } 

    // Using the `in` variable, we can retrieve the values that 
    // we originally wrote into the `Parcel`. This constructor is usually 
    // private so that only the `CREATOR` field can access. 
    private MyParcelable(Parcel in) { 
     mData = in.readInt(); 
     mName = in.readString(); 
     mInfo = in.readParcelable(MySubParcelable.class.getClassLoader()); 
    } 

    public MyParcelable() { 
     // Normal actions performed by class, since this is still a normal object! 
    } 

    // In the vast majority of cases you can simply return 0 for this. 
    // There are cases where you need to use the constant `CONTENTS_FILE_DESCRIPTOR` 
    // But this is out of scope of this tutorial 
    @Override 
    public int describeContents() { 
     return 0; 
    } 

    // After implementing the `Parcelable` interface, we need to create the 
    // `Parcelable.Creator<MyParcelable> CREATOR` constant for our class; 
    // Notice how it has our class specified as its type. 
    public static final Parcelable.Creator<MyParcelable> CREATOR 
      = new Parcelable.Creator<MyParcelable>() { 

     // This simply calls our new constructor (typically private) and 
     // passes along the unmarshalled `Parcel`, and then returns the new object! 
     @Override 
     public MyParcelable createFromParcel(Parcel in) { 
      return new MyParcelable(in); 
     } 

     // We just need to copy this and change the type to match our class. 
     @Override 
     public MyParcelable[] newArray(int size) { 
      return new MyParcelable[size]; 
     } 
    }; 
} 

READ HERE

+0

Вопрос был довольно ясный. Как передавать данные между двумя различными приложениями. Ваше дело будет работать для двух разных видов деятельности. – vgokul129

Смежные вопросы