我在一个没有扩展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);
}
}
普通类中的问题
答案 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)
首先,您必须将context
或activity
引用传递给该方法。
像
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);