[英]Android : destroy activity before intent to another activity
我的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();
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
。 我該怎么做?
非常感謝。
我認為幾乎沒有概念上的問題實際上FLAG_ACTIVITY_CLEAR_TOP標志是Use,請在此處進行檢查: 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);
而已...
每當您需要調用finish()
以完成anonymous inner class
某些活動finish()
如您在上面的代碼中所做的那樣)時,只需傳遞完整活動的名稱(您要銷毀的名稱),例如MainActivity.this.finish()
。 (其中MainActivity是您要銷毀的那個)
創建一個靜態活動對象,該活動在其他活動上完成並在其中分配活動,即您可以添加更多活動
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
}
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.