如何在两个不同的活动中设置不同的抖动检测?

How to set different shake detection in two different activities?

我创建了一个应用程序,它可以在摇动时从第一页转到第二页。但是从第二页开始,它不会回到第一页。如何停止第一页关闭时的抖动activity?

我在两个页面中都实现了 onShake() 方法。

这是主要的Activity:

public class MainActivity extends AppCompatActivity implements ShakeDetector.Listener{
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView t= (TextView) findViewById(R.id.t1);
        t.setText("Hello World");
        SensorManager SM=(SensorManager)getSystemService(SENSOR_SERVICE);
        ShakeDetector SD=new ShakeDetector(this);
        SD.start(SM);
    }

    @Override
    public void hearShake() {
        getWindow().getDecorView().setBackgroundColor(Color.GREEN);
        OpenActivityNew();
    }

    private void OpenActivityNew() {
        Intent intent=new Intent(this,TimeDone.class);
        finish();
        startActivity(intent);
    }
  }

这是第二个Activity:

public class TimeDone extends AppCompatActivity implements  ShakeDetector.Listener{
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.timer_layout);
        TextView t= (TextView) findViewById(R.id.t2);
        t.setText("This is Second Page");
        SensorManager SM=(SensorManager)getSystemService(SENSOR_SERVICE);
        ShakeDetector SD=new ShakeDetector(this);
        SD.start(SM);
    }

    @Override
    public void hearShake() {
        getWindow().getDecorView().setBackgroundColor(Color.GREEN);
        OpenActivityNew();
    }

    private void OpenActivityNew() {
        Intent intent=new Intent(this,MainActivity.class);
        finish();
        startActivity(intent);
    }

我已经为两个 类 实施了相同的操作,因此从一个页面的摇动会传递到另一页,反之亦然。但它仅适用于 MainActivity.

正如我在您的代码中看到的那样,您在两个活动中都在 onCreate() 中启动了 ShakeDetector,但没有停止。所以你需要在开始另一个 Activity 之前停止它,在你的 OpenActivityNew() 里,像这样:

SD.stopShakeDetector(getBaseContext());

为此,当然,您需要在onCreate() 之外声明SensorManager SMShakeDetector SD。只需将它们作为 Class 变量放在外面,这样就可以正常工作:

MainActivity:

public class MainActivity extends AppCompatActivity implements ShakeDetector.Listener {
    private ShakeDetector SD;
    private SensorManager SM;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        SM=(SensorManager)getSystemService(SENSOR_SERVICE);
        SD=new ShakeDetector(this);
        ...
    }
    ...
    private void OpenActivityNew() {
        SD.stopShakeDetector(getBaseContext());
        Intent intent=new Intent(this,TimeDone.class);
        finish();
        startActivity(intent);
    }