2012-05-29 77 views
1

我正在處理我的第一個android應用程序,並且嘗試實施振動器時出現問題。我想要做的是讓AlertDialog顯示一條消息,並且因爲用戶可能實際上並沒有在當時運行該應用程序,所以請發出警報並振動手機,直到他們關閉警報。首先,我沒有使用振動器就可以正常工作,然後當我使用振動器時,它停止了警報聲音,並且不再顯示AlertDialog。我發現我能夠通過在新線程中執行它來解決報警問題,但仍然沒有AlertDialog。所以我試着將振動器移動到一個新的主題,並沒有解決我的問題。所以我目前的問題是,手機會播放鬧鐘聲音和振動,但我告訴它顯示的AlertDialog永遠不會顯示。我怎樣才能讓所有這三樣東西一次起作用?這裏是我的代碼(刪除無關的部分)......Android應用程序,振動器不與AlertDialog一起工作

public class AlarmDisplayActivity extends Activity { 
    private MediaPlayer media; 
    private PowerManager.WakeLock lock; 
    private AlertDialog alert; 
    private Vibrator vibrator; 
    private Thread vibrateThread; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     setContentView(R.layout.alarmdisplay_screen); 

     PowerManager power = (PowerManager)getSystemService(Context.POWER_SERVICE); 
     lock = power.newWakeLock(PowerManager.FULL_WAKE_LOCK | 
      PowerManager.ACQUIRE_CAUSES_WAKEUP, "AlarmReceiverActivity"); 
     alert = new AlertDialog.Builder(AlarmDisplayActivity.this).create(); 
     vibrator = (Vibrator)getSystemService(Context.VIBRATOR_SERVICE); 
     vibrateThread = new VibrateThread(); 

     lock.acquire(); 
     alert.setCancelable(false); 

     alert.setButton("OK", new OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       media.stop(); 
       vibrateThread.interrupt(); 
       lock.release(); 
      }// Ends onClick 
     }// Ends setButton 

     startAlarm(this); 
     vibrateThread.start(); 
     alert.show(); 
    }// Ends onCreate 

    private void startAlarm(final Context context) { 
     new Thread() { 
      public void run() { 
       Uri uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM); 
       if(uri == null) { 
        uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
        if(uri == null) 
         uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM); 
       }// Ends if 

       media = new MediaPlayer(); 
       try{ 
        media.setDataSource(context, uri); 
        final AudioManager audioManager = (AudioManager)context.getSystemService(Context.AUDIO_SERVICE); 
         if(audioManager.getStreamVolume(AudioManager.STREAM_ALARM) != 0) { 
          media.setAudioStreamType(AudioManager.STREAM_ALARM); 
          media.setLooping(true); 
          media.prepare(); 
          media.start(); 
         }// Ends if 
        }// Ends try 
        catch(Exception e){} 
       }// Ends run method 
      }.start(); 
     }// Ends startAlarm method 

     class VibrateThread extends Thread { 
      public VibrateThread() { 
       super(); 
      } 
      public void run() {    
       try { 
        long[] vibPattern = new long[] {0L,100L,250L,1000L,250L,500L}; 
        vibrator.vibrate(vibPattern, 2); 
       }// Ends try 
       catch (Exception e) {} 
      }// Ends run method 
     }// Ends VibrateThread class 

}// Ends AlarmDisplayActivity 

回答

0

我有一種感覺startAlarm阻塞,但它也建議所有非UI移動到不同的線程。我使用AsyncTask來做到這一點,我發現它工作得很好。

AsyncTask的文檔可以找到here。 ,因爲在我的應用程序中,我從我的應用程序中的web服務中獲取,該應用程序阻止了可能也在您的應用程序中發生的整個用戶界面( )。

+0

那麼,他使用一個線程,所以它不會發生在UI線程中 –

相關問題