重新启动finish()ed android活动的问题

时间:2014-12-02 03:07:12

标签: java android android-activity crash

我有两个Android活动,两个都有一个按钮。

活动DetailsActivity是我的MAIN活动。

public class DetailsActivity extends Activity {

    @Override
    public void onCreate(Bundle bundle) {

        super.onCreate(bundle);
        setContentView(R.layout.details_activity_layout);
    }

    @Override
    public void onResume() {

        super.onResume();
    }



    public void gotoSubDetails(View view) {

        Intent intent = new Intent(this, SubDetailsActivity.class);
        startActivity(intent);
        finish();
    }
} 

我的SubDetailsActivity如下:

public class SubDetailsActivity extends Activity {

    @Override
    public void onCreate(Bundle bundle) {

        super.onCreate(bundle);
        setContentView(R.layout.sub_details_activity_layout);
    }

    @Override
    public void onResume() {

        super.onResume();
    }



    public void gotoDetails(View view) {

        Intent intent = new Intent(this, DetailsActivity.class); 
        startActivity(intent); // Restarting the finish()ed activity here.
        finish();
    }
} 

这就是我在details_activity_layout.xml DetailsActivity.java中提到我的按钮的方式:

    <Button android:id="@+id/details_submit"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/to_sub_details"
        android:onClick="gotoSubDetails" />    

这就是我在sub_details_activity_layout.xml SubDetailsActivity.java中提到我的按钮的方式:

    <Button android:id="@+id/sub_details_submit"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/back_to_details"
        android:onClick="gotoDetails" />    

这是我在AndroidManifest.xml中的两项活动:

    <activity android:name="DetailsActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <activity android:name="SubDetailsActivity">
    </activity>

当我点击button中的DetailsActivity时,活动finish()正确且SubDetailsActivity启动。

但是,当我点击button中的SubDetailsActivity以返回finish() ed DetailsActivity时,应用程序会立即在我的LG L90手机上崩溃。

我哪里错了?有帮助吗?请。

PS: 我无法发布日志报告,因为我没有在我的Mac上测试它,而是直接在我的手机上测试。我没有模拟器。我正在编译终端上的代码,并通过蓝牙传输手机上的.apk文件。

修改: 好,朋友们。现在这真的很有趣!

我删除了

android:onClick="gotoSubDetails"  

android:onClick="gotoDetails"  

分别来自details_activity_layout.xmlsub_details_activity_layout.xml。我在android.widget.ButtonDetailsActivity.java加载了SubDetailsActivity.java,并在其中添加了android.view.View.OnClickListener并覆盖了onClick(View)方法。

这就是我在DetailsActivity.java中所做的:

public class DetailsActivity extends Activity {

    @Override
    public void onCreate(Bundle bundle) {

        super.onCreate(bundle);
        setContentView(R.layout.details_activity_layout);

        Button button = (Button)findViewById(R.id.details_submit);
        button.setOnClickListener(new DetailsSubmitListener());
    }

    @Override
    public void onResume() {

        super.onResume();
    }


    public class DetailsSubmitListener implements OnClickListener {

        @Override
        public void onClick(View view) {

            Intent intent = new Intent(this, SubDetailsActivity.class);
            startActivity(intent);
            finish();
        }
    }
}  

这就是我在SubDetailsActivity.java课程中所做的:

public class SubDetailsActivity extends Activity {

    @Override
    public void onCreate(Bundle bundle) {

        super.onCreate(bundle);
        setContentView(R.layout.details_activity_layout);

        Button button = (Button)findViewById(R.id.sub_details_submit);
        button.setOnClickListener(new SubDetailsSubmitListener());
    }

    @Override
    public void onResume() {

        super.onResume();
    }


    public class SubDetailsSubmitListener implements OnClickListener {

        @Override
        public void onClick(View view) {

            Intent intent = new Intent(this, DetailsActivity.class);
            startActivity(intent);
            finish();
        }
    }
}  

奇迹般地工作正常。

那么我的布局文件中的.xml属性有什么问题?它与我.java文件中的硬编码监听器有何不同?这件事让我很困惑。 finish() ed活动可以重新开始。这就是我在程序中的变化所发现的。请详细说明这方面的知识。

3 个答案:

答案 0 :(得分:2)

阿迪蒂亚,

如果您想在两个活动之间进行遍历,就像在您的情况下一样,您永远不应该完成详细信息活动。而不是完成详细信息活动,启动SubDetails活动。如果你想回来,不需要编码。如果用户按下BACK按钮,SubDetails Activity将完成,DetailsActivity将到达前台。

完成一项活动并重新启动它是不必要的开销。躲开它。如果绝对必要,请完成活动。

此外,没有任何方法可以重新启动已完成的活动。

答案 1 :(得分:0)

就像哈利回答一样,

我想为你添加一些东西。如果您正在为更高的API级别(例如Android API 13+)进行编程,则可以定义父级活动。

这样您就不需要进行如此复杂的实施。

供参考

Google Developers Guide to UP navigation

Stackoverflow ANSWER on the topic

答案 2 :(得分:0)

我想你应该读这个!:

http://developer.android.com/guide/components/tasks-and-back-stack.html

我认为你在andriodManifest中为你的活动宣布launchMode是非常重要的!应该有问题。仔细阅读什么是任务以及android中的后台堆栈是如何工作的。

也许您正在完成任务,但同时您正在查看同一任务中的下一个活动!重新打开后,我认为它因此而坠毁。希望它有所帮助。