在我的应用程序中,我有下一个活动结构:
C ---> B ---> A
在活动A中,我持有一个值,例如,这是一个全局HashMap
的值。
从活动C
开始新的活动D
扩展B
,因此结构转换为:
А
|
B
/ \
C D
当我这样做时 - 活动A
被重新创建,我丢失了我存储在那里的所有数据(或者创建了新的活动对象?)
我与A
的{{3}}一起玩,但我没有结果。
如何启动新活动并访问父活动中的对象?
答案 0 :(得分:-1)
当您启动新活动时,应用程序会在已启动的Activity中创建新实例(新对象),并在其层次结构中创建新的Activity实例。
А
|
B
/ \
C D
我想从C和D中读取A的对象 A,B,C,D - 活动。
尝试启动活动D.
startActivity(this,D.class)
onCreate D
onCreate B
onCreate A
所以,我找到了一个让开发人员生活更轻松的解决方案(我认为)。
查看Application类描述:
需要维护全局应用程序状态的基类。
好的,这正是我需要的。但我不想避免施法;(到处申请和获取价值。
阅读更多内容...并查看this回调。
abstract void onActivityCreated(Activity activity, Bundle savedInstanceState)
abstract void onActivityDestroyed(Activity activity)
...
我有个主意。
private HashMap<Department,ArrayList<Person>> departments;
@Override
public void onCreate()
{
super.onCreate();
// initialize your global object
departments = new HashMap<Department,ArrayList<Person>>();
// fill map
departments.put(...);
...
departments.put(...);
// register callbacks
registerActivityLifecycleCallbacks(this);
}
/**
* Created by Sergey Shustikov (pandarium.shustikov@gmail.com)
*/
@Target(value= ElementType.FIELD)
@Retention(value= RetentionPolicy.RUNTIME)
public @interface InjectObject {
}
public class A extends Activity {
@InjectObject
public HashMap<Department,ArrayList<Person>> departments;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
}
}
public class B extends A {
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
}
}
public class C extends B {
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
startActivity(this, D.class);
}
}
public class D extends B {
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
ArrayList<Person> persons = new ArrayList<Person>();
persons.add(new Person("John Smith"));
departments.put(new Department("Google"), persons);
}
}
在Application类中:
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState)
{
Field[] fields = activity.getClass().getFields();
for (Field field : fields) {
if (field.isAnnotationPresent(InjectObject.class)) {
field.setAccessible(true);
try {
if (field.get(activity) == null) {
// Inject object
field.set(activity, departments);
}
} catch (IllegalArgumentException e) {
throw new RuntimeException(e);
} catch (IllegalAccessException e) {
throw new RuntimeException(String.format("Unable to access field %s.", field.getName()), e);
}
}
}
}
之后,您可以从
A
扩展任何活动并获得可共享的HashMap。
当你开始一个新的活动时,应用程序类会抓住它。在这里我们使用反射来注入对象。就是这样。