创建新活动会产生错误"执行暂停未恢复的活动"

时间:2017-09-28 10:18:34

标签: android android-intent android-activity

我过去通过Intent创建了几项活动,但这个错误令我感到困惑。

这是Developer.Android网站上有关创建新Activity

的简单教程

问题:

onPause()之前以及在同一startActivityForResult()

中调用Activtiy之后抛出错误

错误:

E/ActivityThread: Performing pause of activity that is not resumed: {wrap302.nmu.assignment_6_task_2_server/wrap302.nmu.assignment_6_task_2_server.MainActivity}
            java.lang.RuntimeException: Performing pause of activity that is not resumed: {wrap302.nmu.assignment_6_task_2_server/wrap302.nmu.assignment_6_task_2_server.MainActivity}
                at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3398)
                at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3386)
                at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:3361)
                at android.app.ActivityThread.-wrap13(ActivityThread.java)
                at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1374)
                at android.os.Handler.dispatchMessage(Handler.java:102)
                at android.os.Looper.loop(Looper.java:148)
                at android.app.ActivityThread.main(ActivityThread.java:5471)
                at java.lang.reflect.Method.invoke(Native Method)
                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

最小工作示例:

public class MainActivity extends Activity {

    public static String isHost = "isHost";

    private Context mContext;
    private Button btnHostGame;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mContext = this;
        setContentView(R.layout.activity_main);
        btnHostGame = (Button) findViewById(R.id.btnHostGame);
        btnHostGame.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                startGameActivity(true);
            }
        });
    }

    private void startGameActivity(boolean isHosting) {
        Intent intent = new Intent(mContext, GameConnector.class);
        intent.putExtra(isHost, isHosting);
        startActivityForResult(intent, 0);    //Exception occurs after this method
    }

    @Override
    protected void onResume() {
        super.onResume();
        getActionBar().hide();
    }

    // Exception occurs before this method is called
    @Override
    protected void onPause() {
        super.onPause();
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        Toast.makeText(mContext, "Did you win?", Toast.LENGTH_SHORT).show();
    }
}

这对我来说很奇怪,有什么建议吗?

更新

AndroidManifest请求

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="wrap302.nmu.assignment_6_task_2_server">

    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.VIBRATE"/>

    <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme.NoActionBar">
        <activity android:name=".MainActivity"
                  android:label="@string/title_game">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>

                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
        <activity
                android:name=".GameConnector"
                android:label="@string/title_gameconnector">
            <intent-filter>
                <action android:name="android.intent.action.SEND"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
        </activity>
        <activity
                android:name=".Game"
                android:label="@string/title_game">
            <intent-filter>
                <action android:name="android.intent.action.SEND"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>

        </activity>
    </application>

</manifest>

是的,GameConnector确实没有问题。

但是,在调用Exception方法之前,GameConnector.onCreate会被抛出

更新2

GameConnector代码请求

public class GameConnector extends Activity implements FragmentFinishListener{

    public static String GameType = "GameType", GameConnect = "GameConnect";
    public static String PlayerName = "PlayerName";
    private FragmentManager fragmentManager;
    private Fragment gameTypeFragment;
    private Intent gameIntent;
    private boolean isHosting;
    private Context mContext;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_gameconnector);
        mContext = this;
        gameIntent = getIntent();

        if (gameIntent.hasExtra(MainActivity.isHost))
            isHosting = gameIntent.getBooleanExtra(MainActivity.isHost, false);
        fragmentManager = getFragmentManager();
        gameTypeFragment = (isHosting)
                ? new FragmentHostGame().setOnFragmentFinishListener(this)
                : new FragmentJoinGame().setOnFragmentFinishListener(this);
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        fragmentTransaction.add(R.id.fragmentContainer, gameTypeFragment, GameType);
        fragmentTransaction.commit();
    }

    @Override
    public void finished(Bundle bundle) {
        GameConnection gameConnection = null;
        if (bundle != null){
            if (bundle.containsKey(GameConnect))
                gameConnection = (GameConnection) bundle.getSerializable(GameConnect);
        }
        fragmentManager.beginTransaction().remove(gameTypeFragment).commit();

        startGame(isHosting, gameConnection);
    }

    private void startGame(boolean isHosting, GameConnection gameConnection) {
        Intent intent = new Intent(mContext, Game.class);
        intent.putExtra(MainActivity.isHost, isHosting);
        intent.putExtra(GameConnect, gameConnection);
        startActivityForResult(intent, 0);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (data != null){
            switch (requestCode){
                case 0:{
                    if (resultCode == 0){
                        finishActivity(resultCode);
                    }
                    else {
                        setResult(resultCode, data);
                        finishActivity(1);
                    }
                    break;
                }
            }
        }
        setResult(resultCode, null);
        finishActivity(1);
    }
}

0 个答案:

没有答案