如何引用其他课程的当前或主要活动
我经常发现自己需要访问需要引用某些活动的方法。 例如,要使用getWindowManager
,我需要访问一些Activity。 但是我经常使用这些方法的代码是在其他没有引用任何活动的类中。 到目前为止,我已经存储了对主要活动的引用,或者将一些活动的上下文传递给了类。 有没有更好的方法来做到这一点?
传递上下文是参考活动的更好方式。
您可以将上下文传递给另一个类。
IN活动::
AnotherClass Obj = new AnotherClass(this);
另一类
class AnotherClass{ public AnotherClass(Context Context){ } }
如果你已经有一个有效的上下文,只需使用这个: Activity activity = (Activity) context;
您可以在您的活动中实施必要的方法并实施处理程序 。 然后,只需将一个处理程序实例传递给您的类,即可以获取处理程序的消息并将其发送到目标。
你可以让你的应用程序实例成为一个单例,并在你需要一个上下文时使用它
这个问题就是一个例子:
作为Singleton的Android应用程序
这样,当你需要一个上下文,你可以得到它
Context context = MyApplication.getInstance()
这可能不是最干净的解决scheme,但迄今为止,它对我来说效果很好
我find了一种方法让活动成为我在论坛上没有看到的非活动类。 这是在使用getApplicationContext()和传递上下文作为参数给构造函数的许多失败的尝试之后,没有给出活动。 我看到我的适配器正在将传入的上下文转换为Activity,因此我对非活动类构造函数进行了同样的转换:
public class HandleDropdown extends Application{ ... public Activity activity; ... public HandleDropdown() { super(); } public HandleDropdown(Activity context) { this.activity = context; this.context = context; } public void DropList(View v,Activity context) { this.activity = context; this.context = context; ... }
在完成这个转换的上下文到活动后,我可以使用this.activity无论我需要一个活动上下文。
活动交stream的方式有很多。
您可以使用:
-
startActivityForResult方法
-
一个广播消息和接收者系统(你可以从实际的活动中广播一个事件,并在目标活动中注册一个接收者,记住目标活动必须先被初始化并且没有完成)
- 就像你所说的那样,无论你需要什么地方都可以存储目标活动的参考。
我们为此build立了一个框架。 我们有一个从Activity
inheritance的BaseActivity
类,它覆盖了所有的生命周期方法,并有一些静态(类)variables来跟踪活动堆栈。 如果有任何事情想知道当前的活动是什么,它只是在BaseActivity
中调用一个静态方法,它返回我们私人pipe理的栈上的活动。
这是有点hacky,但它的作品。 我不确定我会推荐它。
在你想要做这些方法的类中处理Intent,然后像Bundle一样把你的信息发送给它:
Intent i = new Intent("android.intent.action.MAIN"); i.setComponent(new ComponentName("com.my.pkg","com.my.pkg.myActivity")); Bundle data = new Bundle(); i.putExtras(data); startActivityForResult(i);
然后使用OnActivityResultListener获取新数据。
我是新来的android,所以我的build议可能看起来很guffy,但是如果你只是创build一个作为私人财产的活动的引用,并在OnCreate方法中分配? 你甚至可以用OnCreate创build你的CustomActivity,并从你的CustomActivity派生所有的活动,而不是由adnroid提供的通用Activity。
class blah extends Activity{ private Activity activityReference; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); activityReference = this; } }
我解决了这个问题,让一个单例类有一个下面类的实例作为成员。
public class InterActivityReferrer <T> { HashMap<Integer, T> map; ArrayList<Integer> reserve; public InterActivityReferrer() { map = new HashMap<>(); reserve = new ArrayList<>(); } public synchronized int attach(T obj) { int id; if (reserve.isEmpty()) { id = reserve.size(); } else { id = reserve.remove(reserve.size() - 1); } map.put(id, obj); return id; } public synchronized T get(int id) { return map.get(id); } public synchronized T detach(int id) { T obj = map.remove(id); if (obj != null) reserve.add(id); return obj; } }
这个类可以得到一个T对象,并通过attach()返回一个赋给对象的唯一整数。 除非HashMap失败,否则分配的整数不会相互冲突。 当相应的对象被detach()分离时,每个指定的整数将被释放。 当一个新的对象被连接时,释放的整数将被重用。
而从一个单身人士的课程:
public class SomeSingleton { ... private InterActivityReferrer<Activity> referrer = new InterActivityReferrer<>(); ... public InterActivityReferrer<Activity> getReferrer() {return referrer;} }
从一个需要引用的活动来看:
... int activityID = SomeSingleton.getInstance().getReferrer().attach(this); ...
现在,返回与此活动实例相对应的唯一整数。 通过使用Intent和putExtra(),一个整数可以传递到另一个开始的活动中。
... Intent i = new Intent(this, AnotherActivity.class); i.putExtra("thisActivityID", activityID); startActivityForResult(i, SOME_INTEGER); ...
而从另一个活动:
... id refereeID = getIntent().getIntExtra("thisActivityID", -1); Activity referredActivity = SomeSingleton.getInstance().getReferrer().get(refereeID); ...
最后可以参考活动。 InterActivityReferrer可以用于任何其他类。
我希望这有帮助。
public static Activity getLaunchActivity() { final Class<?> activityThreadClass = Class.forName("android.app.ActivityThread"); final Method methodApp = activityThreadClass.getMethod("currentApplication"); App = (Application) methodApp.invoke(null, (Object[]) null); Intent launcherIntent = App.getPackageManager().getLaunchIntentForPackage(App.getPackageName()); launchActivityInfo = launcherIntent.resolveActivityInfo(App.getPackageManager(), 0); Class<?> clazz; try { clazz = Class.forName(launchActivityInfo.name); if(clazz != null) return Activity.class.cast(clazz.newInstance()); } catch (Exception e) {} return null; }
只是一个猜测,因为我没有这样做,但它可能工作。
1)通过使您的Android应用程序类为Singleton来获取您的应用程序上下文。
2)从上下文获取您的ActivityManager类。
3)使用ActivityManager上的getRunningTasks()获取RunningTaskInfos列表。
4)从列表中获取第一个RunningTaskInfo元素,该列表应该是最近启动的任务。
5)在该RunningTaskInfo上调用topActivity,它将返回该任务的活动堆栈上的顶级活动。
现在,这似乎比这里提到的其他任何方法都要多得多,但是你可以把它封装在一个静态类中,每当它调用的时候。 看起来好像它可能是唯一的方法来获得堆栈顶部的活动,而不添加对活动的引用。