Использование startActivityForResult в приложениях Android

Я написал заявление, которое имеет <intent-filter/> так что другие приложения могут запустить его с помощью startActivityForResult(), Когда это действие закончено, оно создало объект, который похож на:

(Приложение А)

 public class MyObject implements Serializable {
      private String name;
      private String[] items
 }

И установите это на результат:

(Приложение А)

 getIntent().putExtra("Extra_MyObject", myObject);
 setResult(RESULT_OK, getIntent());

Итак, второе действие, которое получает это намерение, имеет проблему, как оно узнает имя дополнительного намерения, которое нужно получить, и как я могу создать полученный объект и вернуть его обратно в MyObject что не является частью этого приложения?

(Приложение Б)

  @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if(requestCode == MY_REQ_CODE){
        if(resultCode == RESULT_OK){
                 // So here how do I know what the intent data name is i.e. "Extra_MyObject"
                 // and how would I know the structure to cast the object back to a MyObject that isn't part of this project?

        }
    }
}

Буду ли я просто подражать MyObject класс во втором приложении и приведение к этому? или есть другие варианты?

2 ответа

Решение

Вы можете использовать библиотеку, такую ​​как Джексон, чтобы сериализовать ваш объект в строку JSON, которую вы затем десериализуете на другом конце.

Это гораздо более гибко и устранит проблему несогласованности версий ваших данных, если вы решите добавить, например, дополнительное поле.

Кроме того, двум приложениям больше не нужно поддерживать класс в одном и том же пространстве имен или даже вызывать их с одинаковыми именами.

И последнее замечание: вам больше не нужно публиковать банку, достаточно только вашей документации.

откуда он знает название намерения дополнительно получить

При прочтении документации API публикуется автор первого приложения.

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

Авторы первой заявки также должны были бы опубликовать JAR, содержащий реализацию MyObject, что авторы второго приложения добавляют в свой проект. И авторам первого приложения никогда не придется менять MyObject или, по крайней мере, удостоверьтесь, что работает версионность сериализации.

Буду ли я просто имитировать класс MyObject во втором приложении и привести его к этому?

Если под "мнемосхемой" вы подразумеваете "иметь класс с точно таким же именем класса, точно таким же именем пакета и точно такой же логикой сериализации", то да, хотя меня тогда беспокоит использование вами термина "просто"...:-)

Если MyObject имеет структуру, которую вы описываете, рассмотрите просто положить String а также String[] как отдельные дополнения, или положить их в Bundle и использовать это как дополнительное, чтобы не пытаться использовать пользовательские Parcelable объекты между приложениями.

Другие вопросы по тегам