Использование 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
объекты между приложениями.