Android:在意图进行另一项活动之前销毁活动

时间:2014-07-25 08:59:12

标签: android android-intent

我的android应用程序中有两个活动:
1. LoginActivity:用户可以使用密码和电子邮件或作为访客作为会员登录 2. MainActivity:在地图上显示用户当前位置

场景:
1.用户登录为客人
2.以访客身份进入主要活动 。 (这里没有NPE)
3.用户采取了一些需要登录的行动 4.意图登录活动
5.在将用户引导到LoginActivity之前,我需要销毁MainActivity 6. LoginActivity上的用户输入用户名和密码
7.如果用户存在且密码为true,请转至MainActivity
8. NPE(或Null Pointer Exception)发生在这里。

因此,在我的情况下,我需要在将用户定向到LoginActivity之前销毁MainActivity(第5点)。我试过这个:

final AlertDialog.Builder builder = new AlertDialog.Builder(context);

final String message = getResources().getString(R.string.NCI);

builder.setMessage(Html.fromHtml("To do your action, we need you to logged in our server"))
.setTitle("LOGIN REQUIRED")
.setPositiveButton("OK",
    new OnClickListener(){
        public void onClick(DialogInterface d, int id){                         
            Intent i = new Intent(MainActivity.this, LoginActivity.class);

            i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(i);
            finish();
        }
    }
);

builder.create().show();

Log Cat

07-25 16:04:27.287: E/AndroidRuntime(19823): FATAL EXCEPTION: main
07-25 16:04:27.287: E/AndroidRuntime(19823): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.yai.properti.tujuh.tujuh.tujuh/com.yai.properti.tujuh.tujuh.tujuh.MainActivity}: java.lang.NullPointerException
07-25 16:04:27.287: E/AndroidRuntime(19823):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2097)
07-25 16:04:27.287: E/AndroidRuntime(19823):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2122)
07-25 16:04:27.287: E/AndroidRuntime(19823):    at android.app.ActivityThread.access$600(ActivityThread.java:140)
07-25 16:04:27.287: E/AndroidRuntime(19823):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1228)
07-25 16:04:27.287: E/AndroidRuntime(19823):    at android.os.Handler.dispatchMessage(Handler.java:99)
07-25 16:04:27.287: E/AndroidRuntime(19823):    at android.os.Looper.loop(Looper.java:137)
07-25 16:04:27.287: E/AndroidRuntime(19823):    at android.app.ActivityThread.main(ActivityThread.java:4895)
07-25 16:04:27.287: E/AndroidRuntime(19823):    at java.lang.reflect.Method.invokeNative(Native Method)
07-25 16:04:27.287: E/AndroidRuntime(19823):    at java.lang.reflect.Method.invoke(Method.java:511)
07-25 16:04:27.287: E/AndroidRuntime(19823):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:994)
07-25 16:04:27.287: E/AndroidRuntime(19823):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:761)
07-25 16:04:27.287: E/AndroidRuntime(19823):    at dalvik.system.NativeStart.main(Native Method)
07-25 16:04:27.287: E/AndroidRuntime(19823): Caused by: java.lang.NullPointerException
07-25 16:04:27.287: E/AndroidRuntime(19823):    at com.yai.properti.tujuh.tujuh.tujuh.MainActivity.onCreate(MainActivity.java:817)
07-25 16:04:27.287: E/AndroidRuntime(19823):    at android.app.Activity.performCreate(Activity.java:5163)
07-25 16:04:27.287: E/AndroidRuntime(19823):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)
07-25 16:04:27.287: E/AndroidRuntime(19823):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2061)
07-25 16:04:27.287: E/AndroidRuntime(19823):    ... 11 more

我通过替换finish()调用方法尝试了onDestroy(),但仍然发生了NPE(空指针异常)。作为MainActivity的第一次意图,NPE没有发生。

我想要is start MainActivity as the first time。我怎么能这样做?

非常感谢。

3 个答案:

答案 0 :(得分:3)

我认为几乎没有概念问题实际上FLAG_ACTIVITY_CLEAR_TOP标志是Use is check here:http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_CLEAR_TOP所以在这种情况下不需要finish()方法它已经删除了mainActivity类但是根据你需要添加的文件还有一个标志FLAG_ACTIVITY_NEW_TASK。

所以替换

Intent i = new Intent(MainActivity.this, LoginActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);
finish();

Intent i = new Intent(MainActivity.this, LoginActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);

多数民众赞成......

答案 1 :(得分:2)

每当您需要调用finish()完成anonymous inner class内的某些活动时,就像在上面的代码中一样,只需传递完整活动的名称(您要销毁的名称) ,如MainActivity.this.finish() ..(其中MainActivity是您要销毁的那个)

答案 2 :(得分:0)

创建一个静态Activity对象,该活动完成其他活动并在其中分配活动 即你可以添加更多活动

public class demoActivity extends AppCompatActivity {
    public static Activity self_intent;
    protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.demo_activity);
            selfintent=this;
    } 

   //Other functions--------------
} 

为其他活动做同样的事情

在其他

activityCloseBtn= (Button) view.findViewById(R.id.activity_close_btn);
activityCloseBtn.setOnClickListener(new View.OnClickListener() {      
       @Override
       public void onClick(View v) {
          demoActivity.selfintent.finish(); //for finish demoActivityactivity

          //for other activities Activity.selfintent.finish();
          finish();  //for finish current activity
      }
});