0

我已经阅读了有关关闭当前活动并通过活动堆栈等返回主活动的信息,但不幸的是,我一直收到 NullPointer,因为我需要关闭我的班级 Game 正在创建的子活动。

这是“游戏”类:

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 是指试图访问它的onDraw()方法的 GameView,因为当我想去我的 MainActivity 时它仍在运行。

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

4

2 回答 2

0

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

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

公共类 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());
    }
}

}

于 2013-04-20T12:41:27.970 回答
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;
}
于 2013-04-20T14:28:33.050 回答