使用Switch在Android上无限期振动

时间:2014-01-16 17:15:14

标签: android switch-statement vibrate vibration

我在Stackoverflow上阅读了很多关于这个问题的内容,但是没有帮助她解决我的问题。 我的问题是我的应用程序总是停在手机上。 我想要一个开关按钮,如果它打开,它应该每10秒无限振动。

package com.example.myapp;

import android.os.Bundle;
import android.os.Vibrator;
import android.app.Activity;
import android.content.Context;
import android.view.Menu;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.Switch;

public class MainActivity extends Activity {

    private Switch mySwitch;
    public // Get instance of Vibrator from current Context
     Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mySwitch = (Switch) findViewById(R.id.myswitch);

        //set the switch to off
        mySwitch.setChecked(false);
        //attach a listener to check for changes in state
        mySwitch.setOnCheckedChangeListener(new OnCheckedChangeListener() {

               @Override
               public void onCheckedChanged(CompoundButton buttonView,
                 boolean isChecked) {

                 if(isChecked){
                    // Start without a delay
                     // Vibrate for 100 milliseconds
                     // Sleep for 1000 milliseconds
                     long[] pattern = {0, 100, 1000};

                     // The '0' here means to repeat indefinitely
                     // '-1' would play the vibration once
                     v.vibrate(pattern, 0);
                 }else{
                     v.cancel();
                 }
               }
        });
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
}

感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

您的错误位于以下行: public //从当前Context获取Vibrator的实例      振动器v =(振动器)getSystemService(Context.VIBRATOR_SERVICE);

在调用onCreate()方法之前,您的Activity无法使用系统服务。 所以你必须在onCreate()方法中初始化你的振动器。

答案 1 :(得分:0)

你可以开始Thread,你可以在其中添加这样的内容:

while (true) {
  v.vibrate(500);  // Half a second
  sleep(10000);    // Wait 10 seconds
}

但由于这将无限期地运行,您还需要在Thread中设置某种条件或事件以在某些情况下停止它(例如,如果某个动作发生,或者BroadcastReceiver 1}}信号触发器。更多信息here

有关停止Thread here的更多信息。

答案 2 :(得分:0)

我的建议是

  1. 您无需使用当前使用的UI线程(Activity) 但是后台服务。
  2. 使用Alarm Manager可以发出重新警报 每10秒钟。
  3. 它应该与屏幕关闭。

    应用许可:

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