按钮返回MainActivity并结束所有正在运行的子活动

时间:2013-04-20 11:18:03

标签: android button android-intent

我已经阅读了关于关闭当前活动并通过活动堆栈等返回主活动但不幸的是我继续收到NullPointer因为我需要关闭我的类游戏正在创建的子活动。

以下是“游戏”类:

package pap.crowslanding;


public class Game extends MainActivity implements OnClickListener {
private MazeBall ball;
protected static GameView gameV;

@Override
public void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.tester1);
    Button settings = (Button) findViewById(R.id.settingsButton);
    Button mainMenu = (Button) findViewById(R.id.backButton);

    ball = (MazeBall) findViewById(R.id.mazeball);
    gameV = (GameView) findViewById(R.id.game_view);

    settings.setOnClickListener(this);
       mainMenu.setOnClickListener(this);

      //Unrequired code removed

    // IF USER PRESSES ON !Main Menu!
    public void onClick(View v) {
        switch (v.getId()){
        case R.id.settingsButton:

        break;
        case R.id.backButton:
            onBackPressed();
        break;
    }
    }

public void onBackPressed() {
    this.finish();//try activityname.finish instead of this
    Intent intent = new Intent(Intent.ACTION_MAIN);
    intent.addCategory(Intent.CATEGORY_HOME);
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);
}
}

我的布局,R.Layout.tester1是一个自定义布局,它运行一个类GameView和MazeBall,你可以在onCreate方法中看到,我的NullPointer指的是GameView试图访问它的{{1} }方法,因为当我想要去我的MainActivity时它仍然在运行。

长话短说,无论如何要终止这些流程?我不能在标准意义上使用finish(),因为GameView不会扩展Activity。

2 个答案:

答案 0 :(得分:0)

我认为每次返回主活动时,您都可以将每个启动活动放入堆栈。

这是一个我用来管理我的应用程序中的所有活动的类,每当我输入一个活动时,在它的onCreate方法中我调用它的addActivity()方法将活动放入堆栈。每次我快速活动时,在onDestory方法中,我调用Manager的finishActivity方法来完成堆栈中最新的输入活动。在您的情况下,我认为您可以创建一个方法来弹出并完成比MainActivity更晚进入堆栈的所有活动,并在每次返回MainActivity时调用该方法。

public class AppManager {

private static Stack<Activity> activityStack;
private static AppManager instance;

private AppManager(){
}

public static AppManager getInstance() {
    if(instance == null)
        instance = new AppManager();
    return instance;
}

public void addActivity(Activity ac) {
    if(activityStack == null)
        activityStack = new Stack<Activity>();
    activityStack.add(ac);
}

public Activity getCurrentActivity(){
    if(activityStack == null)
        return null;
    return activityStack.lastElement();
}

public void finishActivity(Activity ac) {
    if(activityStack != null && ac != null){
        activityStack.remove(ac);
        ac.finish();
        ac = null;
    }
}

public void finishActivity() {
    if(activityStack != null) {
        Activity ac = activityStack.lastElement();
        finishActivity(ac);
    }
}

public void finishActivity(Class<?> cls) {
    if(activityStack == null)
        return;
    for(Activity ac: activityStack){
        if(ac.getClass().equals(cls)){
            finishActivity(ac);
        }
    }
}

public void finishAllActivity(){
    if(activityStack == null)
        return;
    Activity ac;
    for(int i = 0, size = activityStack.size(); i < size; i ++) {
        ac = activityStack.get(i);
        if(ac != null) {
            ac.finish();
        }
    }
    activityStack.clear();
}

public void appExit(Context context) {
    try {
        finishAllActivity();
        System.exit(0);
    } catch (Exception e) {
        Log.e("AppManager", "exit error:" + e.getMessage());
    }
}

}

答案 1 :(得分:0)

如果是非活动类,则需要活动上下文。将上下文传递给非活动类的构造函数。使用上下文启动活动。

context.startActivity(myIntent);

您需要清除堆栈活动。

    case R.id.backButton:
        onBackPressed();
    break;


public void onBackPressed() {
Intent myIntent = new Intent(MyActivity.this, MainActivity.class)
myIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(myIntent);
finish();
return;
}