如何引用另一个类的当前或主要活动

时间:2012-06-27 13:40:55

标签: android android-activity android-context

我经常发现自己需要访问需要引用某些活动的方法。例如,要使用getWindowManager,我需要访问一些Activity。但是,我使用这些方法的代码通常在其他一些没有引用活动的类中。到目前为止,我已经存储了对主要活动的引用,或者将某些活动的上下文传递给了该类。有没有更好的方法来做到这一点?

14 个答案:

答案 0 :(得分:17)

如果您已有有效的上下文,请使用以下命令: Activity activity = (Activity) context;

答案 1 :(得分:13)

传递上下文是参考活动的更好方法。

您可以将Context传递给另一个类。

IN Activity ::

AnotherClass Obj  = new AnotherClass(this);

IN Another Class

class AnotherClass{

public AnotherClass(Context Context){

    }

}

答案 2 :(得分:5)

您可以在活动中实施必要的方法并实施Handler。然后,只需将处理程序实例传递给您的类,您可以在其中获取处理程序的消息并将其发送到目标。

答案 3 :(得分:4)

我找到了一种方法,可以将Activity转到非活动类,我在论坛中没有看过。这是在使用getApplicationContext()和将上下文作为参数传递给构造函数的多次失败尝试之后,其中没有一个给出了Activity。我看到我的适配器正在将传入的上下文转换为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; 
...
}

完成Context对Activity的转换后,我可以在需要Activity上下文的地方使用this.activity。

答案 4 :(得分:2)

活动沟通的方式有很多种。

你可以使用:

  • startActivityForResult方法

  • 广播消息和接收者系统(您可以从实际活动中广播事件,并在目标活动中注册接收者。请记住,目标活动必须先前已初始化且未完成)

  • 如您所说,在任何需要的地方存储目标活动的参考。

答案 5 :(得分:2)

您可以使应用程序实例成为单例,并在需要上下文时使用它

这个问题就是一个例子:
Android Application as Singleton

这样,当你需要一个Context时,你可以用它来获取它 Context context = MyApplication.getInstance()

这可能不是最干净的解决方案,但到目前为止它对我来说效果很好

答案 6 :(得分:1)

我们为此构建了一个框架。我们有一个继承自BaseActivity的{​​{1}}类,它会覆盖所有生命周期方法,并且有一些静态(类)变量可以跟踪活动堆栈。如果有什么想知道当前活动是什么,它只是在Activity中调用一个静态方法,它返回我们私有管理堆栈顶部的活动。

有点hacky,但它确实有效。我不确定我会推荐它。

答案 7 :(得分:1)

我是android新手,所以我的建议可能看起来很糟糕,但如果您只是创建一个对您的活动的引用作为私有属性并在OnCreate方法中分配它会怎么样?您甚至可以使用OnCreate创建CustomActivity,并从CustomActivity派生所有活动,而不是adnroid提供的通用活动。

class blah extends Activity{
  private Activity activityReference;
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        activityReference = this;
    }

}
之后你可以按照你想要的方式使用它,即在

Intent i = new Intent(activityReference, SomeOtherActivity.class)

答案 8 :(得分:0)

处理要执行这些方法的类中的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获取新数据。

答案 9 :(得分:0)

我通过使单例类具有下面的类的实例作为成员来解决这个问题。

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可以用于任何其他类。

我希望这会有所帮助。

答案 10 :(得分:0)

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;
}

答案 11 :(得分:0)

我认为this is the solution to this,您的上下文是静态的,然后静态引用它。

答案 12 :(得分:-1)

我需要从另一个片段内部打开一个片段,但由于项目的性质,我没有使用 FragmentAdapter。

我无法在静态方法或类似方法中强制转换 getSupportFragmentManager()。所以我意识到我需要引用我的活动 MainActivity(负责处理东西)

这里的其他选项不适合我,所以我记得我可以通过使用 getActivity() 来参考我的跑步活动

就是这样。尝试做:

getActivity().theMethodYouNeed();

getActivity().setSomeIntOfYours(validInt);

甚至

int yourInt = getActivity().getSomeIntOfYours();

就这么简单! 只是介意将有效 内容传递给您的活动。如果对您有帮助,请点赞。

答案 13 :(得分:-3)

因为我没有这样做但只是猜测它可能会有效。

1)通过将Android Application类设为Singleton来获取applicationContext。

2)从上下文中获取ActivityManager类。

3)使用ActivityManager上的getRunningTasks()获取RunningTaskInfos列表。

4)从列表中获取第一个应该是最新任务的RunningTaskInfo元素。

5)在RunningTaskInfo上调用topActivity,它应该返回该任务的活动堆栈上的顶级活动。

现在,这似乎比这里提到的任何其他方法更多的工作,但你可以将它封装在一个静态类中,并随时调用它。看起来它可能是在不添加对活动的引用的情况下在堆栈上获得顶级活动的唯一方法。