在不扩展Activity类的类中使用intent

时间:2014-12-10 06:08:55

标签: android android-intent

我在一个没有扩展Activity Class的类中使用Intent时遇到了问题。

如果我在MainActivity中使用intent,那么它的工作完全正常。以下是代码。

public class MainActivity extends ActionBarActivity {
    public void goToRegistrationPage(View view){
        Intent intent   =   new Intent(this, RegistrationActivity.class);       
        startActivity(intent);
        finish();
    }
}

但如果我使用以下方式相同的Intent代码则会出错。

public class Common {
    public static void moveToAnotherActivity(){
        Intent intent   =   new Intent(this,RegistrationActivity.class);
        startActivity(intent);
    }
}

普通类中的问题

  • 这是错误的。
  • 在startActivity方法中出错。
  • 如果我将此转换为上下文,它仍然会给出错误,可能是我没有以正确的方式提供上下文

7 个答案:

答案 0 :(得分:1)

您正在使用的构造函数:

Intent(Context packageContext, Class<?> cls)

(已定义here)需要一个Context对象和一个类,因此您所要做的就是将moveToAnotherActivity()更改为moveToAnotherActivity(Context context)并使用上下文创建意图:< / p>

new Intent(context, RegistrationActivity.class);

任何活动,应用程序或服务都可以是有效的上下文,因此您只需确定哪一个更合适并使用它。

答案 1 :(得分:1)

Intent intent   =   new Intent(this,RegistrationActivity.class);

这意味着您只能使用活动类 或者你应该将ApplicationContext传递给意图类,如

public class Common {

    public static void moveToAnotherActivity(RegistrationActivity obj){
        obj.finish();
        Intent intent   =   new Intent(obj,RegistrationActivity.class);
        obj.startActivity(intent);
    }
}

并使用您的活动Common.moveToAnotherActivity(this)

答案 2 :(得分:1)

在第一个活动中传递对不扩展活动的类的弱引用。

WeakReference<Context> mContext =new WeakReference<Context>(getApplicationContext());


public class Common {
Context ctx;
public Common( WeakReference<Context> ctx){
this.ctx=ctx.get();
}

    public static void moveToAnotherActivity(){
        Intent intent   =   new Intent(this,RegistrationActivity.class);
        ctx.startActivity(intent);
    }
}

答案 3 :(得分:1)

首先,您必须将contextactivity引用传递给该方法。

public class Common {
    public static void moveToAnotherActivity(Activity _activity){
        Intent intent   =   new Intent(_activity.this, RegistrationActivity.class);
        startActivity(intent);
        //You can use finish here like
        _activity.finish();
    }
}

如果您想在此处完成该活动,则通过活动参考,否则从您调用此方法的地方传递finish活动。

您必须从MainActivity致电:

Comman.moveToAnotherActivity(MainActivity.this);

已编辑:根据@Kumara Rajan的解决方案,您可能会收到如下错误:

Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?

您可以通过添加此intent.addFlags( Intent.FLAG_ACTIVITY_NEW_TASK );

来解决

任何问题,随意问。

答案 4 :(得分:0)

您需要在Intent中传递活动的上下文。

如果你的类不是扩展Activity,它将不会保存上下文,因此它将无法工作。

要解决此问题,您可以使用 应用程序上下文 ,并使用以下标志启动单独的任务。

intent.addFlags( Intent.FLAG_ACTIVITY_NEW_TASK );

如果您在活动之外启动活动表格并且未添加上述标志,您将获得以下异常:

android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
at android.app.ContextImpl.startActivity(ContextImpl.java:629)
at android.content.ContextWrapper.startActivity(ContextWrapper.java:258)
at android.webkit.CallbackProxy.uiOverrideUrlLoading(CallbackProxy.java:231)
at android.webkit.CallbackProxy.handleMessage(CallbackProxy.java:326)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:130)

答案 5 :(得分:0)

首先,在班级中创建Context

public class MyClass extends Thread {
    Context mContext;
    public MyClass(Context context){

        this.mContext = context;
}

然后你就像这样召唤你的活动:

public void callActivity(){
    Intent intent = new Intent(mContext.getApplicationContext(),NewActivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    mContext.startActivity(intent);
}

请勿忘记将标志添加到您的意图中,如果您这样做,您将获得例外。

答案 6 :(得分:-1)

在非活动类中使用intent,并将活动的上下文传递给此类: -

Intent intent   =   new Intent(context,RegistrationActivity.class);
context.startActivity(intent);