java class 中的 startActivity 崩溃

startActivity in java class crash

我正在为一个学校项目开发一个 Android 应用程序,我遇到了以下问题。我有一个 MainActivity 和一个 Button 和一个 SecondActivity。当我单击 MainActivity 中的按钮时,它必须打开 SecondActivity。我在我的两台设备(三星 galaxy s9+ 和华硕 zenfone2)上测试了它:

MainActivity.java

public class MainActivity extends AppCompatActivity {
    Button button;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button=(Button)findViewById(R.id.button);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent=new Intent(MainActivity.this,SecondActivity.class)
                startActivity(intent);
            }
        });
}
}

这在两种设备上都能正常工作,当我点击按钮时它会正确打开 SecondActivity。

问题是当我添加控制器 class 并尝试在其中启动 SecondActivity 时。这是控制器 class:

Controller.java

public class Controller {
    public void open(Context cont){
        Intent intent=new Intent(cont,SecondActivity.class);
        cont.getApplicationContext().startActivity(intent);
     }
  }

然后我将 MainActivity 更改为:

public class MainActivity extends AppCompatActivity {
    Button button;
    Controller c;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button=(Button)findViewById(R.id.button2);
        c=new Controller();

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                c.open(getApplicationContext());
            }
        });
}
}

这在我的 s9+ 上运行良好,而在我的 zenfone2 上单击按钮时崩溃。问题出在哪里?如果不正确,为什么适用于 s9+?

谢谢

试试这个,

c.open(MainActivity.this);

并在 Controller class 中执行以下操作:

public void open(Context cont){
        Intent intent=new Intent(cont,SecondActivity.class);
        cont.startActivity(intent);
     }

从 Android P 开始,除非添加 Intent.FLAG_ACTIVITY_NEW_TASK 标志,否则无法使用应用程序上下文启动 activity。所以只需更改您的控制器和 mainactivity 以使用 mainactivity 上下文。

c.open(MainActivity.this);

public void open(Context context) {
    Intent intent = new Intent(context, SecondActivity.class);
    context.startActivity(intent);
}

public void open(Context context) {
    Intent intent = new Intent(context.getApplicationContext(), SecondActivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startActivity(intent);
}

在打开功能中从您的控制器 class 中删除 getApplicationContext()。 做到 cont.startActivity(intent);

您不能再从 getApplicationContext 调用 startActivity 并且您不需要调用它很多次。

getApplicationContext 替换为 "this"。

button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                c.open(MainActivity.class);
            }
        });

然后调用 startActivity

public class Controller {
    public void open(Context cont){
        Intent intent=new Intent(cont,SecondActivity.class);
        cont.startActivity(intent);
     }
  }