【问题标题】:Android : destroy activity before intent to another activityAndroid:在意图另一个活动之前销毁活动
【发布时间】:2014-07-25 08:59:11
【问题描述】:

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

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

因此,在我的情况下,我需要在将用户引导到 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();

原木猫

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。我怎么能这样做?

非常感谢。

【问题讨论】:

  • 请发布您的堆栈跟踪或日志。我们需要查看 NPE 发生在哪里。
  • 既然登录后就返回了,为什么不用startActivityForResult来代替呢?
  • @Shlublu 哎呀,对不起,我忘记发布 LogCat。发生在propertyDownloader = new PropertyDownloader(this, myLocation.getLatitude(), myLocation.getLongitude(), true, progressBar, listDataProperty, noProperty, context); myLocation 变量上的 NPE 为空,但第一次,myLocation 不为空
  • 因此 NPE 似乎与发布的代码无关。使用finish() 没问题,它实际上是停止Activity 的好方法。你会发布涉及的代码吗?
  • 也许在 MainActivity 的第 817 行附近发布更多代码。从您之前的评论来看,它似乎是由您未初始化的变量生成的,因此它实际上与活动生命周期无关。

标签: android android-intent


【解决方案1】:

我认为几乎没有概念问题实际上 FLAG_ACTIVITY_CLEAR_TOP 标志是 Use is check here:http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_CLEAR_TOP 所以在这种情况下不需要完成()方法它已经是删除 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);

就是这样……

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 感谢您的回复,给我一分钟,让我试试。
    • @nobalG 这不是真正的问题,不是吗?
    • 谢谢!非常适合我 +1!
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-14
      • 1970-01-01
      • 1970-01-01
      • 2011-12-09
      • 1970-01-01
      相关资源
      最近更新 更多