2018년 11월 6일 화요일

[Android] 진동알람 만들기

이번시간에는 진동알람에 대해서 살펴보겠다.

먼저, 프로그램을 설명하면 다음과 같다.

1. 사용자가 지정한 시간(초 단위)뒤에 알람이 시작된다.
2. 사용자가 지정한 시간 뒤에 알람 메시지 창이 뜨고 진동이 울린다.
3. 사용자가 메시지 창 종료를 하기 전 까지 혹은 앱을 강제종료하기 전 까지 진동은 계속된다.

안드로이드에서 Vibrator의 클래스의 객체를 생성하여 진동설정을 할 수 있다.

 Vibrator클래스의 사용 
  1.  Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
  2.  long[] pattern = {500, 500, 1000, 1000, 2000, 2000}; // 진동의 멈춤, 시작, 멈춤, 시작의 반복패턴임. 
  3.  // 진동 시작
  4.  vibrator.vibrate(pattern, 0);   // 0은 무한반복 설정임.
  5.  
  6.  // 진동 종료
  7.  vibrator.cancel();

Thread를 통해서 시간을 설정에 맞게 handler의 메시지를 전송시킨다.

Handler를 통해서 생성된 객체 handler로 데이터가 전달되면, handler의 메소드 안에서 진동과 함께 메시지 알람창(AlertDialog)을 띄우게 된다.






 진동 알람 구현  

 1) activity_main.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.    xmlns:app="http://schemas.android.com/apk/res-auto"
  4.    xmlns:tools="http://schemas.android.com/tools"
  5.    android:layout_width="match_parent"
  6.    android:layout_height="match_parent"
  7.    android:weightSum="2"
  8.    android:gravity="center"
  9.    android:orientation="vertical"
  10.    tools:context=".MainActivity">
  11.     <EditText
  12.        android:id="@+id/et"
  13.        android:layout_width="wrap_content"
  14.        android:layout_height="wrap_content"
  15.        android:textSize="30sp"
  16.        android:hint="시간 입력(초 단위)"/>
  17.     <Button
  18.        android:id="@+id/btn"
  19.        android:layout_width="wrap_content"
  20.        android:layout_height="wrap_content"
  21.        android:textSize="30sp"
  22.        android:text="알람시작"/>
  23. </LinearLayout>


 2) MainActivity.class

  1. package com.example.rhkdg.myapplication;
  2. import android.app.AlertDialog;
  3. import android.content.DialogInterface;
  4. import android.os.Bundle;
  5. import android.os.Handler;
  6. import android.os.Message;
  7. import android.os.Vibrator;
  8. import android.support.v7.app.AppCompatActivity;
  9. import android.view.View;
  10. import android.widget.Button;
  11. import android.widget.EditText;
  12. import android.widget.Toast;
  13. public class MainActivity extends AppCompatActivity implements Button.OnClickListener{
  14.     private EditText et;
  15.     private Button btn;
  16.     private Handler handler;
  17.     private Vibrator vibrator;
  18.     private long[] pattern = {50050010001000};
  19.     public void onCreate(Bundle saveInstanceState){
  20.         super.onCreate(saveInstanceState);
  21.         setContentView(R.layout.activity_main);
  22.         btn = findViewById(R.id.btn);
  23.         et = findViewById(R.id.et);
  24.         handler = new Handler(){
  25.           public void handleMessage(Message msg){
  26.               toast(msg.arg1+ "초 뒤 알람시작");
  27.               startVibrate();
  28.           }
  29.         };
  30.         vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
  31.         btn.setOnClickListener(this);
  32.     }
  33.     public void startVibrate(){
  34.         vibrator.vibrate(pattern, 0);
  35.         AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
  36.         builder.setTitle("알람 메시지창")
  37.                 .setPositiveButton("종료"new AlertDialog.OnClickListener(){
  38.                    public void onClick(DialogInterface dialog, int which){
  39.                       toast("알람 종료");
  40.                       stopVibrate();
  41.                    }
  42.                 })
  43.                 .setCancelable(false);
  44.         AlertDialog dialog = builder.create();
  45.         dialog.show();
  46.     }
  47.     public void stopVibrate(){
  48.         vibrator.cancel();
  49.     }
  50.     public void onClick(View v){
  51.         final int seconds = Integer.parseInt(et.getText().toString());
  52.         if(seconds <= 0){
  53.             toast("잘못된 숫자입력입니다.");
  54.             return;
  55.         }
  56.         (new Thread(new Runnable(){
  57.             public void run(){
  58.               try{
  59.                   Thread.sleep(1000 * seconds);
  60.                   Message msg = handler.obtainMessage();
  61.                   msg.arg1 = seconds;
  62.                   handler.sendMessage(msg);
  63.               } catch(InterruptedException e){
  64.                   e.printStackTrace();
  65.               }
  66.             }
  67.         })).start();
  68.     }
  69.     public void toast(String msg){
  70.         Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
  71.     }
  72. }

 ▶실행결과

1) 앱 처음화면


















2) 0초 이하의 값 입력



















3) 진동알람 시작


















4) 진동알람 종료




















이로써 알람앱을 만들어 보았다.
하지만, 앱을 백그라운드에서 실행시키면 에러가 발생한다.
앱을 백그라운드로 이동시키면 onStop()상태가 되어서 메시지를 생성하는 AlertDialog의 객체가 사라지게되서 에러를 발생시킨다.
이러한 상황은 메인화면에 존재하는 객체를 백그라운드 상태에서도 사라지지 않고 유지시켜야 해결이 가능하다.

바로 서비스와 결합해서 사용하도록 해보자.





댓글 없음:

댓글 쓰기

[Java] N-I/O(Non-Blocking) 파일 읽기 쓰기 - GatheringByteChannel, ScatteringByteChannel, ByteBuffer 사용.

우리는 지금까지 다음과 같이 살펴보았다. 1.  InputStream / OutputStream : 입, 출력 스트림을 바이트로 처리하여 읽기, 쓰기. 2.  FileInputStream / FileOutputStream : 입, 출력 스트림을 ...