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 = {500, 500, 1000, 1000};
  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의 객체가 사라지게되서 에러를 발생시킨다.
이러한 상황은 메인화면에 존재하는 객체를 백그라운드 상태에서도 사라지지 않고 유지시켜야 해결이 가능하다.

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





2018년 11월 5일 월요일

[Java] URL과 URI에 대하여

이번시간에는 URI, URL에 대해서 살펴보자.

먼저, URI는 URN과 URL을 포괄하는 광범위한 개념이다.

예전의(지금도 그렇지만,) 인터넷 웹사이트의 URL을 살펴보면 해당 주소가 서버안에 존재하는 디렉터리에 있는 파일을 의미하는 것을 말한다.
즉 해당 웹 사이트의 소스코드로 정의한 파일을 우리는 웹의 주소, URL이라는 것을 통해서 우리에게 제공된다.

하지만 요새는 URI의 개념이 조금 더 많이 쓰이는 것 같다.

웹 사이트의 페이지를 요청하면 URL처럼 파일이 있는 것과 다르게 사용자가 원하는 페이지를 보여주도록 하는 것이다.(라우팅 설정과 비슷하다.) 그래서 웹 개발자가 작성한 소스코드가 있는 파일이 아닌, 경로를 지정해서 사용자가 원하는 페이지에 맞게 보여지도록 하는 것이다.

URL방식에 대해서 살펴보자

1. 클라이언트(사용자)가 웹 서버에 페이지를 요청한다. (Request)

2. 서버는 해당 클라이언트에 맞는 페이지를 가져와 보여준다. (Response) 이때 헤더와 URL주소를 가지고 오게 된다.

3. 클라이언트는 요청받는 웹 페이지를 서핑한다.

Java언어를 통해 URL의 호스트, 프로토콜, 포트, 초기값 포트을 찾아내는 것을 살펴보자.

 1. 해당 URL에 대한 정보들을 살펴보기. 

  1. package org.java.project3;
  2. import java.net.MalformedURLException;
  3. import java.net.URL;
  4. class URLExam{
  5.     public URL url;
  6.     public int port1, port2;
  7.     public String host;
  8.     public String protocol;
  9.    
  10.     public URLExam(String address){
  11.         try {
  12.             this.url = new URL(address);
  13.             this.port1 = this.url.getPort();
  14.             this.port2 = this.url.getDefaultPort();
  15.             this.host = this.url.getHost();
  16.             this.protocol = this.url.getProtocol();
  17.         } catch(MalformedURLException e) {
  18.             e.printStackTrace();
  19.         }
  20.     }
  21. }
  22. public class UrlTest {
  23.     public static void main(String[] args) {
  24.         String address = "http://itqomcom.blogspot.com:8080";
  25.         URLExam url = new URLExam(address);
  26.         System.out.println("URL Address : " + url.url);
  27.         System.out.println("Port1 : " + url.port1);
  28.         System.out.println("Default Port : " + url.port2);
  29.         System.out.println("Protocol : " + url.protocol);
  30.     }
  31. }

 ▶실행결과

URL Address : http://itqomcom.blogspot.com:8080
Port1 : 8080
Default Port : 80
Protocol : http








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

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