ゲーミフィケーションによる睡眠の習慣づけ

ネットワークシステム研究室
指導教員:坂本 直志 教授
11nc038:橋口 和紀

目次


1.はじめに

1.1 研究背景

近年日本では国民の睡眠時間の減少が見受けられる。 2010年のNHKの調査[1]によると国民全体の平均睡眠時間は平日、土曜、日曜のいずれにおいても以前より短くなっていることが分かる。

日本国民全体の平均睡眠時間の変移
図1 日本国民全体の平均睡眠時間の変移

特に大学生においては、坂本玲子の研究[2]によると高校生までの規則正しい生活から一変して自分で決める時間割やアルバイトなど自由な生活が送れるようになることが原因とされている。これにより睡眠の不規則化または夜型化になっていく状況に置かれやすくなっている。また高橋 敏治の研究[3]によると、昼間部と夜間部の学生を比べると夜間部の学生は昼間部の学生より就寝時間が遅いことが分かっている。これらのことから、いずれ社会人になる大学生にとってはこのような習慣を改善する方法があるのではないかと感じ、それを解決する方法を考えた。

1.2 研究目的

本研究の目的は大学生活において不規則になった睡眠時間を改善することである。そのために、日々の規則正しい睡眠の習慣づけを目的とするゲーミフィケーションを導入したアプリケーションの開発をする。そして、実際に使用して効果があったかを検証する。 ゲーミフィケーションについては第2章で述べる。

1.3 関連研究

1.3.1 家事をゲーミフィケーション化する試み~掃除への適用~

市村らは[4]、家事の一つである掃除に関してゲーミフィケーションを導入している。これにより掃除することに対するモチベーションを持続させることを目標としている。掃除機には加速度を取得できる装置を取り付けている。その装置から情報を得て、PC上で処理して後に、結果に基づいた動作をする仕組みである。具体的な動作として①掃除機の動作の応じたポイントを与える、②リアルタイムにスコアを表示されることで前日のポイントと比較することができる、③掃除の連続回数や掃除開始時のTwitterへの投稿、④投稿がリツイートされた場合の音で通知するといったものである。これらは動作にはゲーミフィケーション要素である「即時フィードバック」、「成長の可視化」が導入されている。結果としてこのシステムを用いた場合、楽しみながら掃除ができることが実証されている。このことからゲーミフィケーションによるモチベーションの維持もしくは向上ができていることが分かる。ゲーミフィケーションの要素については第2章で述べる。

2.準備

2.1 ゲーミフィケーション

ここではゲーミフィケーションの概念について述べる。

2.1.1 ゲーミフィケーションとは

ゲーミフィケーションとは、『非ゲーム的な環境にゲーム的な要素を盛り込むこと』[1]である。これにより、ユーザーのモチベーション向上が見込める。一例として、店舗のポイントカードなどが挙げられる。

2.1.2 ゲーミフィケーション要素

ゲーミフィケーションの要素として (1)能動的参加、(2)賞賛演出、(3)即時フィードバック、(4)自己表現、(5)成長の可視化、(6)達成可能な目標が挙げられる[5]。それぞれの要素について説明していく。

(1)能動的参加
能動的参加とは自分から進んで参加することであり、やりたいときにできることを示す。つまり、ユーザーに対する気軽な参加を促す効果を狙ったゲーミフィケーション要素である。
(2)賞賛演出
賞賛演出とは、目標を達成した時にユーザーを褒め称えるような演出を示す。これによりユーザーは達成感を得ることで、次の目標を達成したいというモチベーションの向上を狙っているゲーミフィケーション要素である。
(3)即時フィードバック
即時フィードバックとは、ユーザーがとった行動に対しての反応がすぐに分かることを示しており、ユーザーを飽きさせないような効果を狙ったゲーミフィケーション要素である。
(4)自己表現
自己表現とは、ユーザー自身の個性を表現できるようにすることで、ユーザーに楽しみを与えて、飽きさせないような効果を狙ったゲーミフィケーション要素である。
(5)成長の可視化
成長の可視化とは、記録などのデータを見える状態にすることである。ユーザーは自分の状態を把握することができ、状態の改善や維持を目標とすることができる。結果として、ユーザー自身が立てた目標によりモチベーションを保つことを狙ったゲーミフィケーション要素である。
(6)達成可能な目標
達成可能な目標とは、ユーザーに応じた目標を提示することでモチベーションの維持を狙ったゲーミフィケーション要素である。初めから難易度の高い目標が提示されれば達成できる可能性が低くなり、またモチベーションが低下する場合がある。そのため、初めは難易度の低い目標から提示する必要がある。それから徐々に難易度を上げていき、目標を達成してもらうことでユーザーが達成する楽しみを段々増やしていくことができる。このことからユーザーのモチベーションの維持を見込める。

3.作成したゲーミフィケーションを用いたアプリケーションについて

この章では作成したアプリケーションに関して述べる。

3.1 開発環境

今回作成したアプリケーションはJava言語を使用して開発したAndroidスマートフォン用アプリケーションである。開発環境はEclipseを用いた。また、実機のAndroidスマートフォンにて実装を行った。

3.2 システム概要

このアプリケーションは睡眠時間を記録することができ、睡眠の習慣付けを目標としている。睡眠の習慣づけのために「成長の可視化」と「達成可能な目標」のゲーミフィケーション要素を用いている。具体的には睡眠時間に応じた評価をみることができ、起床後の食事に関する目標を提示している。仕様として、睡眠時間の記録は端末を動かした場合にその時点で停止するようになっている。これにより就寝前にスマートフォンを使えないようにすることで睡眠を促す効果を狙っている。アラーム機能は備えていないが、それは十分な睡眠を取ることを狙っている。また評価機能があり、起床後にユーザーが設定した食事ができるかどうか、ユーザーが指定した時間より早く起きれたかどうかといった二つの項目で評価される。

3.3 全体の流れ

アプリケーションの動作の流れを以下の通りである。

  1. アプリを起動して表示される図2のメイン画面が表示される。上部には記録中において睡眠時間が適時表示される。初回記録以降では、画面中央に前回の記録が表示される。これはゲーミフィケーション要素である「成長の可視化」を導入している。メイン画面の下部には「開始準備」「履歴」「停止」の3つのボタンが配置されている。「開始準備」ボタンを押下することで起床時間設定ダイアログの表示、「履歴」ボタンを押下することで履歴確認画面を表示することができる。「停止」ボタンについては記録開始後で使用する。

    メイン画面
    図2 メイン画面
  2. 図3に起床時間設定ダイアログを示す。起床時間設定ダイアログからユーザーは任意の起床時間を設定する。起床時間設定ダイアログではユーザーの起床予定時刻を設定してもらう。ここではゲーミフィケーションの要素である「達成可能な目標」が導入されている。例として、図3では午前8時30分を指定している。任意の時間を設定後、「OK」ボタンを押下することで次のダイアログが表示される。

    起床時間設定ダイアログ
    図3 起床時間設定ダイアログ
  3. 図4に食事設定ダイアログを示す。食事設定ダイアログではユーザーの起床後の食事を設定してもらう。ここではゲーミフィケーションの要素である「達成可能な目標」を取り入れている。例として図4では「食パン」と入力している。任意の食事を入力後、「OK」ボタンを押下することで次のダイアログが表示される。

    食事設定ダイアログ
    図4 食事設定ダイアログ
  4. 図5に設定確認ダイアログを示す。設定確認ダイアログではユーザーが設定した起床時間と起床後の食事を確認することができる。表示されている内容を確認後、「記録開始」ボタンを押下することでメイン画面に戻り、記録が開始される。図6のようにメイン画面上部には現在の記録が表示される。ここで「停止」ボタンを押下する、または端末をある程度動かした場合に次のダイアログが表示される。

    設定確認ダイアログ
    図5 設定確認ダイアログ
    記録開始後のメイン画面
    図6 記録開始後のメイン画面

    端末を動かしたかどうか判定する主なソースコードを以下に示す。

    public void onSensorChanged(SensorEvent event) {
       // TODO 自動生成されたメソッド・スタブ
    
      float a0 = radianToDegree(orientationValues[0]);
      float a1 = radianToDegree(orientationValues[1]);
      float a2 = radianToDegree(orientationValues[2]);
    
      if (event.accuracy == SensorManager.SENSOR_STATUS_ACCURACY_LOW)
        return;
    
      switch (event.sensor.getType()) {
      case Sensor.TYPE_MAGNETIC_FIELD:
        magneticValues = event.values.clone();
        break;
      case Sensor.TYPE_ACCELEROMETER:
        accelerometerValues = event.values.clone();
        break;
      }
    
      if (magneticValues != null && accelerometerValues != null) {
    
        SensorManager.getRotationMatrix(inR, I, accelerometerValues,
            magneticValues);
    
        SensorManager.remapCoordinateSystem(inR, SensorManager.AXIS_X,
            SensorManager.AXIS_Z, outR);
        SensorManager.getOrientation(outR, orientationValues);
    
        Log.v("Orientation",
            String.valueOf(radianToDegree(orientationValues[0]))
                + ", "
                + String.valueOf(radianToDegree(orientationValues[1]))
                + ", "
                + String.valueOf(radianToDegree(orientationValues[2])));
      }
    
      boolean isOverYaw = (Math.abs(a0) - Math.abs(val0)) > 30;
      boolean isOverPitch = (Math.abs(a1) - Math.abs(val1)) > 30;
      boolean isOverRoll = (Math.abs(a2) - Math.abs(val2)) > 30;
    
      if (isStart == true) {
        timeTextView = (TextView) findViewById(R.id.timeTextView);
    
        RecordTime.setEndTime();
        timeTextView.setText(RT.ViewRecordTime(RT.getStartTime(),
            RT.getEndTime()));
        if (isOverYaw || isOverPitch || isOverRoll) {
    
          isStart = false;
          isOver = true;
          RecordTime.setEndTime();
          timeTextView.setText(RT.ViewRecordTime(RT.getStartTime(),
              RT.getEndTime()));
    
          ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
          List<RunningAppProcessInfo> processInfoList = am
              .getRunningAppProcesses();
          for (RunningAppProcessInfo info : processInfoList) {
            if (info.processName.equals(getPackageName())) {
              if (info.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
                if (isScreenon)
                  ShowCheckDialog();
              }
            }
          }
    
          changeData();
    
        }
    
      }
    
      val0 = a0;
      val1 = a1;
      val2 = a2;
    }

    ここではセンサー値が変化した場合に呼び出されるonSensorChangedを用いて、端末がある程度動いたかを判定を行っている。判定方法としてはonSensorChangedが呼び出されたときのセンサー値と、その直前に呼び出されたときのセンサー値からそれぞれの場合の方位角と傾きを求めて比較している。ここでは30°を超えた場合に端末を動かしたときの処理を行うようにしている。センサー値については加速度センサーと地磁気センサーを取得しており、これらを変換することで方位角と傾きを求めることができる。

  5. 図7に食事確認ダイアログを示す。食事確認ダイアログでは質問が表示される。質問の内容は「ユーザーが設定した食事ができる時間があるかどうか」である。その質問に対してユーザーは「はい」ボタンもしくは「いいえ」ボタンを押下することで回答する。いずれかのボタンを押下した後、次のダイアログが表示される。

    食事確認ダイアログ
    図7 食事確認ダイアログ
  6. 図8に結果確認ダイアログを示す。結果確認ダイアログでは、記録と質問の回答に応じた結果、またそれらの評価を確認することができる。「OK」ボタンを押下することでメイン画面が表示されて、一連の記録が終了となる

    結果確認ダイアログ
    図8 結果確認ダイアログ
  7. 次回以降、メイン画面に前回の記録が表示されるようになる。また「履歴」ボタンを押すことで、いままでの記録を確認することができる。図9に履歴確認画面を示す。履歴確認画面ではこれまでユーザーが記録してきた睡眠時間、その日時と評価が一覧で表示される。「戻る」ボタンを押下するとメイン画面に戻る。ここではゲーミフィケーション要素である「成長の可視化」が導入されている。

    履歴確認画面
    図9履歴確認画面

4.実験

この章では行った実験について述べる。

4.1 実験の目的

実際にゲーミフィケーションを導入したアプリケーションを使用することで、睡眠にどのような影響があるのかを調べるための実験を行った。

4.2 実験内容

以下の2つのアプリケーションを用いて、自分の睡眠時間を記録した。

  1. 睡眠時間だけを記録するアプリケーション
  2. 本研究で作成したゲーミフィケーションを導入したアプリケーション

(1)に関しては4週間、(2)に関しては1週間に利用して記録した。なお、(1)は(2)の睡眠時間を記録する機能のみで、ゲーミフィケーションを導入していないアプリケーションである。これらの結果から、①「無理なく取り組めたかどうか」、②「十分に寝ることができているかどうか」の2つの項目を検証することで、ゲーミフィケーションを用いたアプリケーションの有用性を示す。

5.実験結果と考察

5.1 実験結果

まず睡眠時間のみを記録するアプリケーションを使用した場合の記録を表1と表2、図10と図11に示す。なお、データが0の箇所は未記録であることを示している。

表1 1週間目から2週間目の記録結果
9月30日 6時21分27秒
10月01日 0時00分00秒
10月02日 6時17分01秒
10月03日 5時13分31秒
10月04日 7時22分47秒
10月05日 5時14分26秒
10月06日 6時20分03秒
10月07日 4時15分14秒
10月08日 5時10分14秒
10月09日 3時17分43秒
10月10日 4時47分44秒
10月11日 7時06分38秒
10月12日 3時46分34秒
10月13日 4時58分54秒
表2 3週間目から4週間目の記録結果
10月14日 7時03分54秒
10月15日 1時07分33秒
10月16日 2時05分20秒
10月17日 5時02分17秒
10月18日 5時10分21秒
10月19日 6時56分06秒
10月20日 6時27分17秒
10月21日 3時42分52秒
10月22日 5時03分31秒
10月23日 6時44分24秒
10月24日 9時04分30秒
10月25日 4時29分16秒
10月26日 5時26分22秒
10月27日 5時06分07秒

図10 1週間目から2週間目の記録結果 図11 3週間目から4週間目の記録結果
図10 1週間目から2週間目の記録結果 図11 3週間目から4週間目の記録結果
表3 ゲーミフィケーション要素を導入したアプリケーションによる1週間の記録結果
1月2日 3時14分56秒
1月3日 5時08分52秒
1月4日 9時40分34秒
1月5日 4時21分00秒
1月6日 3時48分52秒
1月7日 4時43分28秒
1月8日 4時12分49秒
ゲーミフィケーション要素を導入したアプリケーションによる1週間の記録結果
図12 ゲーミフィケーション要素を導入したアプリケーションによる1週間の記録結果
表4 質問と起床時間に応じた評価
1月2日 1月3日 1月4日 1月5日 1月6日 1月7日 1月8日
質問
起床時間 ×
評価

5.2 考察

実験結果について考察する。まずゲーミフィケーションを用いたアプリケーションを使用した場合の記録から、一週間全ての記録を取ることができていることが確認できる。限られた期間ではあるが、継続的にアプリケーションを使用することができている。また表4から分かるように、ほぼ高評価であることからゲーミフィケーション要素である「達成可能な目標」が実現できている。さらにアプリケーション起動時にメイン画面で前回の記録が表示されることで「成長の可視化」も有効に働いたと考えられる。これらのことがモチベーションの維持に繋がり、継続的に記録を取ることができたと考えられる。よって睡眠の記録の関しては無理なく取り組めたと考えられる。次に睡眠時間に関しては、ゲーミフィケーションの有無に関わらず大きな変化は見られなかった。しかしながら生活が乱れやすい年明けにも関わらず、睡眠を確保できていることが結果からわかる。これはゲーミフィケーションを導入したアプリケーションにより意識して睡眠に取り組めたことが要因であると考えられる。このことから睡眠時間をある程度取ることができていると考えられる。これらのことから今回の実験において、ゲーミフィケーションを導入したアプリケーションにより、意識してある程度睡眠を確保することができ、研究目標である睡眠の習慣づけが達成できたと言える。

6.結論

この章では本研究全体のまとめと、今後の課題を述べる。

6.1 まとめ

年々、日本において国民の睡眠時間の低下が顕著になっている。特に大学生に関してはいままでよりある程度自由な生活ができることから、睡眠の不規則化や夜型になりやすい状況になっている。いずれそのような生活は改善しなければならないと感じ、今回睡眠習慣を改善するためのゲーミフィケーションを導入したアプリケーションを開発した。このアプリケーションは睡眠の記録を取るのみではなく、モチベーションを維持して睡眠を改善していくことを目指した。このアプリケーションを用いて実験を行った。実験の結果からはゲーミフィケーションを導入したアプリケーションを使うことで、意識して睡眠の記録と確保ができた。よって研究目標である睡眠の習慣づけがある程度達成できた。

6.2 今後の課題

今後の課題としては、まずどのようにして十分な睡眠を取り続けれるようにするのかが挙げられる。よく寝れたかどうかといった質問も追加して、よく寝れた場合の記録から適した睡眠時間の算出する機能が必要だと感じた。これにより様々なユーザーに対応できると考えられる。また実験では著者のみの記録だったことから、さらに期間を伸ばして複数人のデータを取るべきであった。その結果から良い睡眠の習慣づけの方法の模索を今後の課題としたい。

参考文献

謝辞

本研究を進めるにあたり、ご指導頂いた工学部情報通信工学科ネットワークシステム研究室 坂本 直志 教授に感謝します。 また日常の議論を通じて多くの知識や示唆を頂いたネットワークシステム研究室の皆様に感謝します。

(付録)ソースコード

本研究で作成したソースコードを以下に示す。

MainActivity.java (メイン画面)

package com.example.sleep;

import java.util.List;

import com.example.sleep.R;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.ActivityManager.RunningAppProcessInfo;
import android.app.AlertDialog;
import android.app.FragmentManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.database.sqlite.SQLiteDatabase;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;

@SuppressLint("SimpleDateFormat")
public class MainActivity extends Activity implements SensorEventListener {
  private SensorManager sm;
  private float val0;
  private float val1;
  private float val2;
  private static final int MATRIX_SIZE = 16;

  float[] inR = new float[MATRIX_SIZE];
  float[] outR = new float[MATRIX_SIZE];
  float[] I = new float[MATRIX_SIZE];

  float[] orientationValues = new float[3];
  float[] magneticValues = new float[3];
  float[] accelerometerValues = new float[3];
  static SleepRecordDao dao;
  private SQLiteDatabase db;
  private DBHelper helper;
  private static LinearLayout showData;
  private EditText dataEdit;

  private boolean IsMagSensor;
  private boolean IsAccSensor;
  private static boolean isStart = false;
  private static boolean isOver = false;
  boolean isScreenon = true;

  private static TextView timeTextView;

  public static RecordTime RT = new RecordTime();

  String TAG = getClass().getSimpleName();
  BroadcastReceiver onReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
      Log.v(TAG, "onReceive()");
      isScreenon = true;
    }
  };

  BroadcastReceiver offReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
      Log.v(TAG, "onReceive()");
      isScreenon = false;
    }
  };

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    IntentFilter onfilter = new IntentFilter(Intent.ACTION_SCREEN_ON);
    try {
      registerReceiver(onReceiver, onfilter);
    } catch (RuntimeException e) {
    }

    IntentFilter offfilter = new IntentFilter(Intent.ACTION_SCREEN_OFF);
    try {
      registerReceiver(offReceiver, offfilter);
    } catch (RuntimeException e) {
    }
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);

    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.activity_main);
    sm = (SensorManager) this.getSystemService(SENSOR_SERVICE);

    Button stopbtn = (Button) findViewById(R.id.stopbtn);
    stopbtn.setOnClickListener(getOnClickStopListener());

    Button historybtn = (Button) findViewById(R.id.history);
    historybtn.setOnClickListener(new OnClickListener() {
      @Override
      public void onClick(View v) {

        Intent subintent = new Intent(MainActivity.this,
            SubActivity.class);

        if (!isStart)
          startActivity(subintent);
      }
    });

    Button testbtn = (Button) findViewById(R.id.startbtn);
    testbtn.setOnClickListener(new OnClickListener() {
      @Override
      public void onClick(View v) {
        if (isStart == false) {
          FragmentManager manager = getFragmentManager();
          TimeDialogFragment dialog = new TimeDialogFragment();
          dialog.show(manager, null);
        }
      }
    });

    helper = new DBHelper(this, null, 1);
    db = helper.getReadableDatabase();
    dao = new SleepRecordDao(db);

    showData = (LinearLayout) findViewById(R.id.showData);

    changeData();

  }

  public static OnClickListener getOnClickListener() {

    return new OnClickListener() {

      @Override
      public void onClick(View v) {

        if (isStart == false) {
          v.getContext().startService(
              new Intent(v.getContext(), MainService.class));
          RecordTime.setStartTime();
          isStart = true;
        }
      }
    };
  }

  public OnClickListener getOnClickStopListener() {

    return new OnClickListener() {

      @Override
      public void onClick(View v) {

        if (isStart == true) {

          RecordTime.setEndTime();

          timeTextView = (TextView) findViewById(R.id.timeTextView);

          timeTextView.setText(RT.ViewRecordTime(RT.getStartTime(),
              RT.getEndTime()));

          isStart = false;

          FragmentManager manager = getFragmentManager();
          CheckDialogFragment dialog = new CheckDialogFragment();
          dialog.show(manager, null);

          changeData();
        }

      }
    };
  }

  @Override
  protected void onStart() {
    super.onStart();
    System.out.println("onstart");
  }

  @Override
  public void onResume() {

    super.onResume();

    List<Sensor> sensors = sm.getSensorList(Sensor.TYPE_ALL);
    for (Sensor sensor : sensors) {

      if (sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
        sm.registerListener(this, sensor,
            SensorManager.SENSOR_DELAY_NORMAL);
        IsMagSensor = true;
      }

      if (sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
        sm.registerListener(this, sensor,
            SensorManager.SENSOR_DELAY_NORMAL);
        IsAccSensor = true;
      }
    }
    if (isOver == true) {
      ShowCheckDialog();
    }
  }

  protected void onPause() {
    super.onPause();
    if (isStart == false)
      sm.unregisterListener(this);
  }

  @Override
  protected void onStop() {
    super.onStop();

    if (isStart == false) {
      sm.unregisterListener(this);
    }

  }

  @Override
  protected void onRestart() {
    super.onRestart();
    if (isStart == false)
      sm.unregisterListener(this);
  }

  @Override
  public void onDestroy() {
    super.onDestroy();

    sm.unregisterListener(this);
    unregisterReceiver(offReceiver);
    unregisterReceiver(onReceiver);
    db.close();
    if (IsMagSensor || IsAccSensor) {
      sm.unregisterListener(this);
      IsMagSensor = false;
      IsAccSensor = false;
    }

  }

  public void ShowCheckDialog() {
    FragmentManager manager = getFragmentManager();
    CheckDialogFragment dialog = new CheckDialogFragment();
    dialog.show(manager, null);
    isOver = false;
  }

  @Override
  public void onAccuracyChanged(Sensor sonsor, int accuracy) {
    // TODO 自動生成されたメソッド・スタブ
    trace("onAccuracyChanged : " + accuracy);
  }

  @Override
  public void onSensorChanged(SensorEvent event) {
    // TODO 自動生成されたメソッド・スタブ

    float a0 = radianToDegree(orientationValues[0]);
    float a1 = radianToDegree(orientationValues[1]);
    float a2 = radianToDegree(orientationValues[2]);

    if (event.accuracy == SensorManager.SENSOR_STATUS_ACCURACY_LOW)
      return;

    switch (event.sensor.getType()) {
    case Sensor.TYPE_MAGNETIC_FIELD:
      magneticValues = event.values.clone();
      break;
    case Sensor.TYPE_ACCELEROMETER:
      accelerometerValues = event.values.clone();
      break;
    }

    if (magneticValues != null && accelerometerValues != null) {

      SensorManager.getRotationMatrix(inR, I, accelerometerValues,
          magneticValues);

      SensorManager.remapCoordinateSystem(inR, SensorManager.AXIS_X,
          SensorManager.AXIS_Z, outR);
      SensorManager.getOrientation(outR, orientationValues);

      Log.v("Orientation",
          String.valueOf(radianToDegree(orientationValues[0]))
              + ", "
              + String.valueOf(radianToDegree(orientationValues[1]))
              + ", "
              + String.valueOf(radianToDegree(orientationValues[2])));
    }

    boolean isOverYaw = (Math.abs(a0) - Math.abs(val0)) > 30;
    boolean isOverPitch = (Math.abs(a1) - Math.abs(val1)) > 30;
    boolean isOverRoll = (Math.abs(a2) - Math.abs(val2)) > 30;

    if (isStart == true) {
      timeTextView = (TextView) findViewById(R.id.timeTextView);

      RecordTime.setEndTime();
      timeTextView.setText(RT.ViewRecordTime(RT.getStartTime(),
          RT.getEndTime()));
      if (isOverYaw || isOverPitch || isOverRoll) {

        isStart = false;
        isOver = true;
        RecordTime.setEndTime();
        timeTextView.setText(RT.ViewRecordTime(RT.getStartTime(),
            RT.getEndTime()));

        ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        List<RunningAppProcessInfo> processInfoList = am
            .getRunningAppProcesses();
        for (RunningAppProcessInfo info : processInfoList) {
          if (info.processName.equals(getPackageName())) {
            if (info.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
              if (isScreenon)
                ShowCheckDialog();
            }
          }
        }

        changeData();

      }

    }

    val0 = a0;
    val1 = a1;
    val2 = a2;
  }

  int radianToDegree(float rad) {
    return (int) Math.floor(Math.toDegrees(rad));
  }

  private void trace(String msg) {
    // TODO 自動生成されたメソッド・スタブ
  }

  public void addData(View view) {

    dao.insert(dataEdit.getText().toString());

    changeData();
  }

  private void changeData() {

    showData.removeAllViews();

    List<DBEntity> entityList = dao.getLastData();

    for (DBEntity entity : entityList) {
      final TextView LastRecordView = (TextView) findViewById(R.id.lastrecordtime);
      LastRecordView.setText("前回の記録 " + entity.getTime() + " "
          + entity.getAssess());
    }
  }

  public boolean onKeyDown(int keyCode, KeyEvent event) {

    if (keyCode == KeyEvent.KEYCODE_BACK) {
      if (isStart == false) {
        return super.onKeyDown(keyCode, event);
      } else {
        AlertDialog.Builder ad = new AlertDialog.Builder(this);
        ad.setMessage(getString(R.string.endMessage));
        ad.setPositiveButton(getString(R.string.yes),
            new DialogInterface.OnClickListener() {
              public void onClick(DialogInterface dialog,
                  int whichButton) {
                finish();
              }
            });
        ad.setNegativeButton(getString(R.string.no),
            new DialogInterface.OnClickListener() {
              public void onClick(DialogInterface dialog,
                  int whichButton) {
              }
            });
        ad.create();
        ad.show();
        return false;
      }
    } else {
      return super.onKeyDown(keyCode, event);
    }
  }

  public static String getTimeTextView() {
    // TODO 自動生成されたメソッド・スタブ
    return timeTextView.getText().toString();
  }

}
				

SubActivity.java (履歴確認画面)

package com.example.sleep;

import java.util.List;

import android.app.Activity;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;

public class SubActivity extends Activity {

  private SleepRecordDao dao;
  private LinearLayout showData;

  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);

        requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.sub_main);

    Button backbtn = (Button) findViewById(R.id.backbtn);
    backbtn.setOnClickListener(new OnClickListener() {
      @Override
      public void onClick(View v) {
        finish();
      }
    });

    DBHelper helper = new DBHelper(this, null, 1);
    SQLiteDatabase db = helper.getReadableDatabase();
    dao = new SleepRecordDao(db);

    showData = (LinearLayout) findViewById(R.id.showData);

    changeData();
  }

  private void changeData() {

    showData.removeAllViews();

    List<DBEntity> entityList = dao.findAll();

    for (DBEntity entity : entityList) {
      TextView textView = new TextView(this);
      textView.setTextColor(Color.WHITE);
      textView.setTextSize(24.0f);
      textView.setText(entity.getRowId() + " : " + entity.getAssess()
          +"\n" + entity.getRecord()+"\n 経過時間: "+entity.getTime()+"\n");
      showData.addView(textView);
    }
  }

}
				

TimeDialogFragment.java (起床時間設定ダイアログ)

package com.example.sleep;

import java.util.Calendar;

import android.app.Dialog;
import android.app.DialogFragment;
import android.app.FragmentManager;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.WindowManager;
import android.widget.TimePicker;

public class TimeDialogFragment extends DialogFragment {

  private static int SetHour;
  private static int SetMinute;
  private static Calendar cal;

  @Override
  public Dialog onCreateDialog(Bundle savedInstanceState) {

    Dialog Timedialog = new Dialog(getActivity());
    Timedialog.setCanceledOnTouchOutside(false);
    Timedialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
    Timedialog.getWindow().setFlags(
        WindowManager.LayoutParams.FLAG_FULLSCREEN,
        WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN);
    Timedialog.setContentView(R.layout.timedialog);
    Timedialog.getWindow().setBackgroundDrawable(
        new ColorDrawable(Color.TRANSPARENT));

    final TimePicker timepicker = (TimePicker) Timedialog
        .findViewById(R.id.time_picker);
    timepicker.setIs24HourView(true);

    Timedialog.findViewById(R.id.positive_button).setOnClickListener(
        new OnClickListener() {
          @Override
          public void onClick(View v) {

            SetHour = timepicker.getCurrentHour();
            SetMinute = timepicker.getCurrentMinute();

            cal = Calendar.getInstance();
            cal.setTimeInMillis(System.currentTimeMillis());
            // 設定した時刻をカレンダーに設定
            //cal.set(Calendar.DAY_OF_YEAR, Calendar.DAY_OF_YEAR);
            cal.set(Calendar.HOUR_OF_DAY, SetHour);
            cal.set(Calendar.MINUTE, SetMinute);
            cal.set(Calendar.SECOND, 0);
            cal.set(Calendar.MILLISECOND, 0);

            if (cal.getTimeInMillis() < System.currentTimeMillis()) {
              cal.add(Calendar.DAY_OF_YEAR, 1);
            }

            FragmentManager manager = getFragmentManager();
            EatDialogFragment dialog = new EatDialogFragment();
            dialog.show(manager, "dialog");
            dismiss();
          }
        });
    Timedialog.findViewById(R.id.close_button).setOnClickListener(
        new OnClickListener() {
          @Override
          public void onClick(View v) {
            dismiss();
          }
        });
    return Timedialog;
  }
  public static Calendar getSetCalender() {
    return cal;
  }
  static int getSetHour() {
    return SetHour;
  }
  static int getSetMinute() {
    return SetMinute;
  }
}
		

EatDialogFragment.java (食事設定ダイアログ)

package com.example.sleep;

import android.app.Dialog;
import android.app.DialogFragment;
import android.app.FragmentManager;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.text.SpannableStringBuilder;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.WindowManager;
import android.widget.EditText;

public class EatDialogFragment extends DialogFragment {
  String setFoodName = null;
  private static SpannableStringBuilder FoodName;

  @Override
  public Dialog onCreateDialog(Bundle savedInstanceState) {
    final Dialog Eatdialog = new Dialog(getActivity());
    Eatdialog.setCanceledOnTouchOutside(false);
    Eatdialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
    Eatdialog.getWindow().setFlags(
        WindowManager.LayoutParams.FLAG_FULLSCREEN,
        WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN);
    Eatdialog.setContentView(R.layout.eatdialog);
    Eatdialog.getWindow().setBackgroundDrawable(
        new ColorDrawable(Color.TRANSPARENT));

    final EditText editFoodName = (EditText) Eatdialog
        .findViewById(R.id.editfoodname);
    Eatdialog.findViewById(R.id.positive_button).setOnClickListener(
        new OnClickListener() {

          @Override
          public void onClick(View v) {

            setFoodName = editFoodName.getText().toString();
            if (!isBlank(editFoodName.getText().toString())) {

              FragmentManager manager = getFragmentManager();
              StartDialogFragment dialog = new StartDialogFragment();
              FoodName = (SpannableStringBuilder) editFoodName
                  .getText();

              dialog.show(manager, "dialog");
              dismiss();
            }
          }
        });

    Eatdialog.findViewById(R.id.close_button).setOnClickListener(
        new OnClickListener() {
          @Override
          public void onClick(View v) {
            dismiss();
          }
        });

    return Eatdialog;
  }
  public static boolean isBlank(String str) {
    if (str == null || str.length() == 0)
      return true;

    int l = str.length();
    for (int i = 0; i < l; i++) {
      if (!Character.isWhitespace(str.codePointAt(i)))
        return false;
    }
    return true;
  }

  static SpannableStringBuilder getFoodName() {
    return FoodName;
  }
}
		

StartDialogFragment.java (設定確認ダイアログ)

package com.example.sleep;

import java.util.Date;

import android.app.Dialog;
import android.app.DialogFragment;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.WindowManager;
import android.widget.TextView;

public class StartDialogFragment extends DialogFragment {

  private static Date date = new Date();
  @Override
  public Dialog onCreateDialog(Bundle savedInstanceState) {
    final Dialog Startdialog = new Dialog(getActivity());
    Startdialog.setCanceledOnTouchOutside(false);
    Startdialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
    Startdialog.getWindow().setFlags(
        WindowManager.LayoutParams.FLAG_FULLSCREEN,
        WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN);
    Startdialog.setContentView(R.layout.startdialog);
    Startdialog.getWindow().setBackgroundDrawable(
        new ColorDrawable(Color.TRANSPARENT));

    TextView time = (TextView) Startdialog.findViewById(R.id.settime);
    time.setText("設定した時刻 "+TimeDialogFragment.getSetHour()+"時"+TimeDialogFragment.getSetMinute()+"分");

    TextView food = (TextView) Startdialog.findViewById(R.id.foodname);
    food.setText("設定した朝食 "+EatDialogFragment.getFoodName());

    Startdialog.findViewById(R.id.positive_button).setOnClickListener(
        new OnClickListener() {

          @Override
          public void onClick(View v) {

            v.setOnClickListener(MainActivity.getOnClickListener());
            v.callOnClick();
            dismiss();
          }
        });
    Startdialog.findViewById(R.id.close_button).setOnClickListener(
        new OnClickListener() {
          @Override
          public void onClick(View v) {
            dismiss();
          }
        });
    return Startdialog;
  }
  static Date getStartDate(){
    return date;
  }
}
		

CheckDialogFragment.java(食事確認ダイアログ)

package com.example.sleep;
import android.app.Dialog;
import android.app.DialogFragment;
import android.app.FragmentManager;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.WindowManager;
import android.widget.TextView;

public class CheckDialogFragment extends DialogFragment {
  String setFoodName = null;
  private static int id;

  @Override
  public Dialog onCreateDialog(Bundle savedInstanceState) {

    final Dialog Checkdialog = new Dialog(getActivity());
    Checkdialog.setCanceledOnTouchOutside(false);
    Checkdialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
    Checkdialog.getWindow().setFlags(
        WindowManager.LayoutParams.FLAG_FULLSCREEN,
        WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN);
    Checkdialog.setContentView(R.layout.checkdialog);
    Checkdialog.getWindow().setBackgroundDrawable(
        new ColorDrawable(Color.TRANSPARENT));
    this.setCancelable(false);


    TextView food = (TextView) Checkdialog.findViewById(R.id.foodname);
    food.setText("「" + EatDialogFragment.getFoodName() + "」を食べる時間はありますか?");

    Checkdialog.findViewById(R.id.positive_button).setOnClickListener(
        new OnClickListener() {

          @Override
          public void onClick(View v) {
            FragmentManager manager = getFragmentManager();
            ResultDialogFragment dialog = new ResultDialogFragment();
            v.getContext().stopService(new Intent(v.getContext(),MainService.class));
            id=v.getId();
            dialog.show(manager, "dialog");
            dismiss();

          }
        });

    Checkdialog.findViewById(R.id.negative_button).setOnClickListener(
        new OnClickListener() {

          @Override
          public void onClick(View v) {
            FragmentManager manager = getFragmentManager();
            ResultDialogFragment dialog = new ResultDialogFragment();
            v.getContext().stopService(new Intent(v.getContext(),MainService.class));
            dialog.show(manager, "dialog");
            id=v.getId();
            dismiss();

          }
        });
    return Checkdialog;
  }

  static int getbtnId(){
    return id;
  }

}
		

ResultDialogFragment.java (結果確認ダイアログ)

package com.example.sleep;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import android.app.Dialog;
import android.app.DialogFragment;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.view.WindowManager;
import android.widget.TextView;

public class ResultDialogFragment extends DialogFragment {
  int score = 0;

  @Override
  public Dialog onCreateDialog(Bundle savedInstanceState) {

    final Dialog Resultdialog = new Dialog(getActivity());
    RecordTime RT = new RecordTime();

    Resultdialog.setCanceledOnTouchOutside(false);
    Resultdialog.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
    Resultdialog.getWindow().setFlags(
        WindowManager.LayoutParams.FLAG_FULLSCREEN,
        WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN);
    Resultdialog.setContentView(R.layout.resultdialog);
    Resultdialog.getWindow().setBackgroundDrawable(
        new ColorDrawable(Color.TRANSPARENT));

    TextView sleepingtime = (TextView) Resultdialog
        .findViewById(R.id.hours_of_sleep);
    TextView checkontime = (TextView) Resultdialog
        .findViewById(R.id.ontime);
    TextView checkeat = (TextView) Resultdialog.findViewById(R.id.checkeat);
    TextView evaluation = (TextView) Resultdialog
        .findViewById(R.id.total_evaluation);

    String btnid = String.valueOf(CheckDialogFragment.getbtnId());
    Calendar cln = Calendar.getInstance();

    sleepingtime.setText("継続時間"
        + RT.ViewRecordTime(RT.getStartTime(), RT.getEndTime()));

    DoEat(checkeat, btnid);

    int diff = cln.compareTo(TimeDialogFragment.getSetCalender());
    ValueonTime(checkontime, diff);

    TotalEvaluation(evaluation);

    String START = new SimpleDateFormat("MM/dd HH:mm:ss").format(RT
        .getStartTime());
    String END = new SimpleDateFormat("MM/dd HH:mm:ss").format(RT
        .getEndTime());
    MainActivity.dao.doAddinsert(MainActivity.getTimeTextView(),
        START + " ~ " + END, " " + evaluation.getText().toString());

    Resultdialog.findViewById(R.id.positive_button).setOnClickListener(
        new OnClickListener() {
          @Override
          public void onClick(View v) {
            score = 0;
            dismiss();
          }
        });
    Resultdialog.findViewById(R.id.close_button).setOnClickListener(
        new OnClickListener() {
          @Override
          public void onClick(View v) {
            score = 0;
            dismiss();
          }
        });
    return Resultdialog;
  }
  private void DoEat(TextView checkeat, String btnid) {
    System.out.println(btnid);
    if (btnid.equals("2131034183")) {
      checkeat.setText("食事:○");
      score += 1;
    } else if (btnid.equals("2131034184")) {
      checkeat.setText("食事:×");
    }
  }
  private void ValueonTime(TextView checkontime, int diff) {
    if (diff < 0) {
      checkontime.setText("起床時間:○");
      score += 1;
    } else {
      checkontime.setText("起床時間:×");
    }
  }
  private void TotalEvaluation(TextView evaluation) {
    if (score > 1) {
      evaluation.setText("総合評価:◎");
    } else if (score > 0) {
      evaluation.setText("総合評価:○");
    } else {
      evaluation.setText("総合評価:△");
    }
  }
}
		

DBEntity.java

package com.example.sleep;

public class DBEntity {
  private int rowId;
  private String record;
  private String time;
  private String assess;

  public void setRowId(int rowId) {
    this.rowId = rowId;
  }
  public int getRowId() {
    return rowId;
  }
  public void setTime(String time) {
    this.time = time;
  }
  public String getTime() {
    return time;
  }
  public void setRecord(String record) {
    this.record = record;
  }
  public String getRecord() {
    return record;
  }
  public void setAssess(String assess) {
    this.assess = assess;
  }
  public String getAssess() {
    return assess;
  }
}
		

DBHelper.java

package com.example.sleep;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;

public class DBHelper extends SQLiteOpenHelper {

  private static final String DB_NAME = "recorddb";

  private static final String CREATE_TABLE_SQL = ""
      + "create table recorddb ("
      + "rowid integer primary key autoincrement, "
      + "data text not null," + "day text not null,"
      + "assess text not null" + ")";

  private static final String DROP_TABLE_SQL = "drop table if exists recorddb";

  public DBHelper(Context context, CursorFactory factory, int version) {

    super(context, DB_NAME, factory, version);
  }

  @Override
  public void onCreate(SQLiteDatabase db) {
    db.execSQL(CREATE_TABLE_SQL);
  }

  @Override
  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL(DROP_TABLE_SQL);
    db.execSQL(CREATE_TABLE_SQL);
  }

}
		

MainService.java

package com.example.sleep;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.IBinder;
import android.support.v4.app.NotificationCompat;

//import android.util.Log;

public class MainService extends Service {

   private static final int START_STICKY = 1;

  @Override
  public void onCreate() {
  }
  protected void onHandleIntent(Intent intent) {
  }

  @Override
  public int onStartCommand(Intent intent, int flags, int startId) {
    Notification notification = new NotificationCompat.Builder(this)
        .setContentTitle("睡眠時間記録中").setContentText("睡眠時間を記録しています")
        .setSmallIcon(R.drawable.ic_launcher).build();
    NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    manager.notify(1, notification);
    startForeground(1, notification);
    return START_STICKY;
  }

  @Override
  public void onDestroy() {
    super.onDestroy();
    stopSelf();
  }
  @Override
  public IBinder onBind(Intent intent) {
    // TODO 自動生成されたメソッド・スタブ
    return null;
  }
}
		

RecordTime.java

package com.example.sleep;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import android.app.Activity;

public class RecordTime extends Activity {
  private int second;
  private int min;
  private int hour;
  private long time;
  private static long EndTime;
  private static long StartTime;

  ByteArrayOutputStream str = new ByteArrayOutputStream();
  PrintStream ps = new PrintStream(str);

  public static void setStartTime() {
    StartTime = System.currentTimeMillis();
  }
  public static void setEndTime() {
    EndTime = System.currentTimeMillis();
  }
  public long getStartTime() {
    return StartTime;
  }
  public long getEndTime() {
    return EndTime;
  }
  public String ViewRecordTime(long starttime, long stoptime) {
    time = stoptime - starttime;
    time /= 1000;
    second = (int) (time % 60);
    time /= 60;
    min = (int) (time % 60);
    time /= 60;
    hour = (int) (time % 60);

    ByteArrayOutputStream str = new ByteArrayOutputStream();
    PrintStream ps = new PrintStream(str);
    ps.printf("%1$02d:%2$02d:%3$02d", hour, min, second);
    try {
      str.close();
    } catch (IOException e) {
    }
    ps.close();
    return str.toString();
  }
}
		

SleepRecordDao.java

package com.example.sleep;
import java.util.ArrayList;
import java.util.List;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
public class SleepRecordDao {
  private static final String TABLE_NAME = "recorddb";
  private static final String COLUMN_ID = "rowid";
  private static final String COLUMN_DATA = "data";
  private static final String COLUMN_DAY = "day";
  private static final String COLUMN_ASSESS = "assess";
  private static final String[] COLUMNS = { COLUMN_ID, COLUMN_DATA,
      COLUMN_DAY,COLUMN_ASSESS };
  private SQLiteDatabase db;
  public SleepRecordDao(SQLiteDatabase db) {
    this.db = db;
  }
  public List<DBEntity> findAll() {
    List<DBEntity> entityList = new ArrayList<DBEntity>();
    Cursor cursor = db.query(TABLE_NAME, COLUMNS, null, null, null, null,
        COLUMN_ID);
    while (cursor.moveToNext()) {
      DBEntity entity = new DBEntity();
      entity.setRowId(cursor.getInt(0));
      entity.setTime(cursor.getString(1));
      entity.setRecord(cursor.getString(2));
      entity.setAssess(cursor.getString(3));
      entityList.add(entity);
    }
    return entityList;
  }

  public DBEntity findById(int rowId) {
    String selection = COLUMN_ID + "=" + rowId;
    Cursor cursor = db.query(TABLE_NAME, COLUMNS, selection, null, null,
        null, null);
    cursor.moveToNext();
    DBEntity entity = new DBEntity();
    entity.setRowId(cursor.getInt(0));
    entity.setTime(cursor.getString(1));
    entity.setRecord(cursor.getString(2));
    entity.setAssess(cursor.getString(3));
    return entity;
  }
  public long insert(String value) {
    ContentValues values = new ContentValues();
    values.put(COLUMN_DATA, value);
    return db.insert(TABLE_NAME, null, values);
  }
  public void doAddinsert(String value, String day,String assess) {
    ContentValues values = new ContentValues();
    values.put(COLUMN_DATA, value);
    values.put(COLUMN_DAY, day);
    values.put(COLUMN_ASSESS, assess);
    db.insert(TABLE_NAME, null, values);
  }
  public int update(DBEntity entity) {
    ContentValues values = new ContentValues();
    values.put(COLUMN_DATA, entity.getRecord());
    String whereClause = COLUMN_ID + "=" + entity.getRowId();
    return db.update(TABLE_NAME, values, whereClause, null);
  }
  public int delete(int rowId) {
    String whereClause = COLUMN_ID + "=" + rowId;
    return db.delete(TABLE_NAME, whereClause, null);
  }
  public List<DBEntity> getLastData() {
    List<DBEntity> entityList = new ArrayList<DBEntity>();
    Cursor cursor = db.query(TABLE_NAME, COLUMNS, null, null, null, null,
        COLUMN_ID);
    DBEntity entity = new DBEntity();
    while (cursor.moveToNext()) {
      entity.setRowId(cursor.getInt(0));
      entity.setTime(cursor.getString(1));
      entity.setRecord(cursor.getString(2));
      entity.setAssess(cursor.getString(3));
      entityList.add(entity);
    }
    return entityList;
  }
}
				

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/black"
    tools:context="com.example.sleep.MainActivity" >
    <ScrollView
        android:id="@+id/ScrollView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fillViewport="true" >
        <LinearLayout
            android:id="@+id/showData"
            android:layout_width="wrap_content"
            android:layout_height="230dp"
            android:layout_marginTop="0dp"
            android:orientation="vertical"
            android:padding="0px"
            android:textSize="18sp" >
        </LinearLayout>
    </ScrollView>
    <TextView
        android:id="@+id/timeTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="57dp"
        android:text="@string/_00_00_00"
        android:textColor="@color/white"
        android:textSize="30sp" />
    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true" />
    <Button
        android:id="@+id/stopbtn"
        android:layout_width="100dip"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:background="@drawable/button_corners"
        android:text="@string/stop"
        android:textColor="@color/black" />
    <Button
        android:id="@+id/startbtn"
        android:layout_width="100dip"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:background="@drawable/button_corners"
        android:text="@string/setting"
        android:textColor="@color/black" />
    <TextView
        android:id="@+id/lastrecordtime"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text=""
        android:textColor="@color/white"
        android:textSize="24sp" />
    <Button
        android:id="@+id/history"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:background="@drawable/button_corners"
        android:text="@string/history"
        android:textColor="@color/black" />
</RelativeLayout>
		

sub_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/black"
    tools:context="com.example.sleep.SubActivity" >
    <ScrollView
        android:id="@+id/ScrollView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@+id/backbtn"
        android:fillViewport="true" >
        <LinearLayout
            android:id="@+id/showData"
            android:layout_width="wrap_content"
            android:layout_height="230dp"
            android:layout_marginTop="0dp"
            android:orientation="vertical"
            android:padding="0px"
            android:textSize="18sp" >
        </LinearLayout>
    </ScrollView>
    <ListView
        android:id="@+id/listView1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />
    <Button
        android:id="@+id/backbtn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:background="@drawable/button_corners"
        android:text="@string/back"
        android:textColor="@color/black" />
</RelativeLayout>
		

timedialog.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="6dp"
        android:layout_marginRight="6dp"
        android:layout_marginTop="6dp"
        android:background="@drawable/bg_dialog"
        android:gravity="center_horizontal"
        android:orientation="vertical"
        android:paddingBottom="20dp" >
        <TextView
            android:id="@+id/title"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/bg_dialog_title"
            android:padding="10dp"
            android:text="@string/settimedialogtitle"
            android:textColor="@color/black"
            android:textSize="18sp" />
        <TextView
            android:id="@+id/message"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="20dp"
            android:lineSpacingExtra="6dp"
            android:text="@string/settimedialogMessage"
            android:textColor="#333333"
            android:textSize="16sp" />
        <TimePicker
            android:id="@+id/time_picker"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
        <Button
            android:id="@+id/positive_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="6dp"
            android:background="@drawable/bt_dialog_positive"
            android:text="@string/OK"
            android:textColor="@android:color/white" />
    </LinearLayout>
    <Button
        android:id="@+id/close_button"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:background="@drawable/bt_dialog_close"
        android:text="@string/close"
        android:textColor="#9acd32" />
</RelativeLayout>
		

eatdialog.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="6dp"
        android:layout_marginRight="6dp"
        android:layout_marginTop="6dp"
        android:background="@drawable/bg_dialog"
        android:gravity="center_horizontal"
        android:orientation="vertical"
        android:paddingBottom="20dp" >
        <TextView
            android:id="@+id/title"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/bg_dialog_title"
            android:padding="10dp"
            android:text="@string/whateat_title"
            android:textColor="@color/black"
            android:textSize="18sp" />
        <TextView
            android:id="@+id/message"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="20dp"
            android:lineSpacingExtra="6dp"
            android:text="@string/whateat_message"
            android:textColor="#333333"
            android:textSize="16sp" />
        <EditText
            android:inputType="text"
            android:id="@+id/editfoodname"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint=""
            android:ems="10" >
            <requestFocus />
        </EditText>
        <Button
            android:id="@+id/positive_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="6dp"
            android:background="@drawable/bt_dialog_positive"
            android:text="@string/OK"
            android:textColor="@android:color/white" />
    </LinearLayout>
    <Button
        android:id="@+id/close_button"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:background="@drawable/bt_dialog_close"
        android:text="@string/close"
        android:textColor="#9acd32" />
</RelativeLayout>
		

startdialog.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="6dp"
        android:layout_marginRight="6dp"
        android:layout_marginTop="6dp"
        android:background="@drawable/bg_dialog"
        android:gravity="center_horizontal"
        android:orientation="vertical"
        android:paddingBottom="20dp" >

        <TextView
            android:id="@+id/title"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/bg_dialog_title"
            android:padding="10dp"
            android:text="@string/startdialog_title"
            android:textColor="@color/black"
            android:textSize="18sp" />

        <TextView
            android:id="@+id/message"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="20dp"
            android:lineSpacingExtra="6dp"
            android:text="@string/startdialog_message"
            android:textColor="#333333"
            android:textSize="16sp" />

        <TextView
            android:id="@+id/settime"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text=""
            android:textAppearance="?android:attr/textAppearanceLarge" />

        <TextView
            android:id="@+id/foodname"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text=""
            android:textAppearance="?android:attr/textAppearanceLarge" />

        <Button
            android:id="@+id/positive_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="6dp"
            android:background="@drawable/bt_dialog_positive"
            android:text="@string/start"
            android:textColor="@android:color/white" />


    </LinearLayout>

    <Button
        android:id="@+id/close_button"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:background="@drawable/bt_dialog_close"
        android:text="@string/close"
        android:textColor="#9acd32" />

</RelativeLayout>
		

checkdialog.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="6dp"
        android:layout_marginRight="6dp"
        android:layout_marginTop="6dp"
        android:background="@drawable/bg_dialog"
        android:gravity="center_horizontal"
        android:orientation="vertical"
        android:paddingBottom="20dp" >
        <TextView
            android:id="@+id/title"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/bg_dialog_title"
            android:padding="10dp"
            android:text="@string/check_title"
            android:textColor="@color/black"
            android:textSize="18sp" />
        <TextView
            android:id="@+id/message"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="20dp"
            android:lineSpacingExtra="6dp"
            android:text="@string/check_message"
            android:textColor="#333333"
            android:textSize="16sp" />

        <TextView
            android:id="@+id/settime"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text=""
            android:textAppearance="?android:attr/textAppearanceLarge" />
        <TextView
            android:id="@+id/foodname"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text=""
            android:textAppearance="?android:attr/textAppearanceLarge" />
        <Button
            android:id="@+id/positive_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="6dp"
            android:background="@drawable/bt_dialog_positive"
            android:text="@string/yesbtn"
            android:textColor="@android:color/white" />
        <Button
            android:id="@+id/negative_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="6dp"
            android:background="@drawable/bt_dialog_positive"
            android:text="@string/nobtn"
            android:textColor="@android:color/white" />
    </LinearLayout>
</RelativeLayout>
		

resultdialog.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_marginLeft="6dp"
        android:layout_marginRight="6dp"
        android:layout_marginTop="6dp"
        android:background="@drawable/bg_dialog"
        android:gravity="center_horizontal"
        android:orientation="vertical"
        android:paddingBottom="20dp" >
        <TextView
            android:id="@+id/title"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/bg_dialog_title"
            android:padding="10dp"
            android:text="@string/result_title"
            android:textColor="@color/black"
            android:textSize="18sp" />
        <TextView
            android:id="@+id/checkeat"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text=""
            android:textColor="#333333"
/>
        <TextView
            android:id="@+id/ontime"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="" />
        <TextView
            android:id="@+id/hours_of_sleep"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text=""/>
        <TextView
            android:id="@+id/total_evaluation"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text=""
            android:textAppearance="?android:attr/textAppearanceLarge" />
        <Button
            android:id="@+id/positive_button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="6dp"
            android:background="@drawable/bt_dialog_positive"
            android:text="@string/OK"
            android:textColor="@android:color/white" />
    </LinearLayout>
    <Button
        android:id="@+id/close_button"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:background="@drawable/bt_dialog_close"
        android:text="@string/close"
        android:textColor="#9acd32" />
</RelativeLayout>
		

bg_dialog_title.xml

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" >
</animation-list>
		

bg_dialog.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
    <corners android:radius="5dp" />
    <stroke
        android:width="2dp"
        android:color="#9acd32" />
    <gradient
        android:angle="90"
        android:endColor="#dcdcdc"
        android:startColor="#ffffff" />
</shape>
		

bg_title.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
    <corners
        android:topLeftRadius="5dp"
        android:topRightRadius="5dp" />
    <solid android:color="#9acd32" />
</shape>
		

bt_dialog_close.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval" >
    <solid android:color="@android:color/white" />
    <stroke
        android:width="3dp"
        android:color="#9acd32" />
</shape>
		

bt_dialog_positive.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
    <corners android:radius="5dp" />
    <solid android:color="#9acd32" />
</shape>
		

button_corners.xml

< xml version="1.0" encoding="utf-8" >
<selector xmlns:android="http://schemas.android.com/apk/res/android">
 <item android:state_pressed="false">
  <shape android:shape="rectangle">
    <solid android:color="#ff4effa5"/>
    <stroke android:width="1dp" android:color="#fffdfdfd"/>
    <corners android:radius="4dp"/>
    <padding android:top="8dp" android:left="16dp" android:bottom="8dp" android:right="16dp"/>
  </shape>
 </item>
 <item android:state_pressed="true">
  <shape android:shape="rectangle">
   <solid android:color="#ff409048"/>
   <stroke android:width="1dp" android:color="#fffdfdfd"/>
   <corners android:radius="4dp"/>
   <padding android:top="8dp" android:left="16dp" android:bottom="8dp" android:right="16dp"/>
  </shape>
 </item>
</selector>
		

main.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context="com.example.b01.MainActivity" >

    <item
        android:id="@+id/action_settings"
        android:orderInCategory="100"
        android:title="@string/action_settings"
        app:showAsAction="never"/>

</menu>
		

colors.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="white">#FFFFFF</color>
    <color name="black">#000000</color>
    <color name="blue">#0000FF</color>
    <color name="red">#FF0000</color>
    <color name="yellow">#FFFF00</color>
    <color name="green">#00FF00</color>
    <color name="purple">#9900CC</color>
    <color name="pink">#FF00FF</color>
    <color name="gray">#BEBEBE</color>
    <color name="ivory">#EEEEE0</color>
    <color name="orange">#FF9900</color>
    <color name="brown">#CC9900</color>
    <color name="cream">#FFFFCC</color>
    <color name="darkcyan">#008B8B</color>
    <color name="lightyellow">#ffffE0</color>
    <color name="wheat">#F5DEB3</color>
    <color name="slateblue">#6A5ACD</color>
</resources>
		

strings.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="app_name">sleep</string>
    <string name="action_settings">Settings</string>
    <string name="endMessage">アプリを終了しますか?</string>
    <string name="yes">終了する</string>
    <string name="no">アプリへ戻る</string>
    <string name="_00_00_00">00:00:00</string>
    <string name="stop">停止</string>
    <string name="setting">記録準備</string>
    <string name="start">記録開始</string>
    <string name="history">履歴</string>
    <string name="back">戻る</string>
    <string name="settimedialogMessage">起床する時刻を選択してください。</string>
    <string name="settimedialogtitle">起床時間の設定</string>
    <string name="whateat_title">起きたら何を食べますか?</string>
    <string name="whateat_message">食べるものを入力してください。</string>
    <string name="startdialog_title">設定完了</string>
    <string name="startdialog_message">
  記録開始ボタンを押すと記録が開始されます。
  テーブルなどの安定する場所に置いて記録を開始してください。</string>
    <string name="OK">OK</string>
    <string name="close">X</string>
    <string name="check_title">確認</string>
    <string name="check_message">以下のことを確認してボタンを押してください</string>
    <string name="result_title">今回の結果</string>
    <string name="result_message">以下のような結果になりました。</string>
    <string name="yesbtn">はい</string>
    <string name="nobtn">いいえ</string>
</resources>
		

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.sleep"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="15" />

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

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.sleep.MainActivity"
            android:label="@string/app_name"
            android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <service
            android:name="MainService"
            android:enabled="true" >
        </service>
        <activity android:name="com.example.sleep.SubActivity" >
        </activity>
        <activity
            android:name="CheckDialogFragment"
            android:launchMode="singleInstance"
            android:theme="@android:style/Theme.Translucent.NoTitleBar" >
        </activity>
    </application>
</manifest>