한 걸음 두 걸음

안드로이드 시스템 프로그래밍 #01 ] 모바일센싱 본문

FrontEnd/mobile system programming

안드로이드 시스템 프로그래밍 #01 ] 모바일센싱

언제나 변함없이 2019. 3. 6. 10:45
반응형

ios경우에는 가공된 센서데이터값을 사용할 수 있도록 iOS Core Motion Framework 제공, android도 마찬가지입니다.

모바일 센싱 파이프라인(mobile sensing pipeline)

activity를 sensing하여 raw데이터를 얻고 feature 추출 후(context labeling), 정규화(classification, 머신러닝 알고리즘 사용)시켜 application에서 필요로 하는 의미있는 정보로 전달합니다.

모바일 센싱의 어려움

  • 지속적으로 센서 데이터를 수집하고, 데이터를 처리하기 때문에 센싱작업은 배터리(자원)소모가 심합니다.
  • 핸드폰은 동시에 여러 application을 활용하는 기기이기 때문에, 해당 application에서 요구하는 context inference 정확도 사이에 적당한 수준을 찾아야합니다.

안드로이드 센싱 기능을 활용하기

Application Framework에서 제공하는 서비스 API를 사용해야한다.
API종류는 SensorManager, LocationManager, WiFiManager, BluetoothManager, PowerManager 등이 있으므로 필요에 따라 활용하면 된다.

Android application 주요 요소

  1. 컴포넌트 : Activity, Service, BroadCast Receiver, Content Provider
    (Service는 백그라운드에서 실행되는 컴포넌트로, 비가시적이며 오랫동안 실행디는 백그라운드 작업 및 원격 프로세스 작업을 수행한다.)
    (BroadCastReceiver는 System or application이 전송하는 broadcast값을 선택적으로 수신한다.) (BroadCast는 mobile에서 방생하는 various event or infomaion or 컴포넌트간 정보 전달에 쓰이는 data이다.)
  2. Intent : 비가시적인 시스템으로, 컴포넌트를 실행시킨다.
  3. Manifest file : xml로 작성하는 안드로이드 앱의 환경 설정 파일
    (-> permission권한, API레벨, 앱 컴포넌트 등을 선언)

실습!

01


한 번에 구현, 소스코드 : activity_main

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#EAEAEA"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="30dp"
        android:layout_marginStart="16dp"
        android:layout_marginLeft="16dp"
        android:layout_marginTop="28dp"
        android:layout_marginEnd="359dp"
        android:layout_marginRight="359dp"
        android:text="이름 : "
        android:textSize="20sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginLeft="16dp"
        android:layout_marginTop="10dp"
        android:text="학교 : "
        android:textSize="20sp"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView" />

    <TextView
        android:id="@+id/textView3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginLeft="16dp"
        android:layout_marginTop="10dp"
        android:layout_marginEnd="359dp"
        android:layout_marginRight="359dp"
        android:text="학부 : "
        android:textSize="20sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView2" />

    <TextView
        android:id="@+id/textView4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginLeft="16dp"
        android:layout_marginTop="10dp"
        android:layout_marginEnd="359dp"
        android:layout_marginRight="359dp"
        android:text="학번 : "
        android:textSize="20sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView3" />

    <EditText
        android:id="@+id/editTextName"
        android:layout_width="wrap_content"
        android:layout_height="30dp"
        android:layout_marginStart="15dp"
        android:layout_marginLeft="15dp"
        android:layout_marginTop="32dp"
        android:layout_marginEnd="115dp"
        android:layout_marginRight="115dp"
        android:background="@drawable/blackline"
        android:ems="10"
        android:inputType="textMultiLine|textNoSuggestions"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toEndOf="@+id/textView"
        app:layout_constraintTop_toTopOf="parent" />

    <EditText
        android:id="@+id/editTextSchool"
        android:layout_width="wrap_content"
        android:layout_height="30dp"
        android:layout_marginStart="15dp"
        android:layout_marginLeft="15dp"
        android:layout_marginTop="10dp"
        android:layout_marginEnd="115dp"
        android:layout_marginRight="115dp"
        android:background="@drawable/blackline"
        android:ems="10"
        android:inputType="textPersonName"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toEndOf="@+id/textView2"
        app:layout_constraintTop_toBottomOf="@+id/editTextName" />

    <EditText
        android:id="@+id/editTextMajor"
        android:layout_width="wrap_content"
        android:layout_height="30dp"
        android:layout_marginStart="15dp"
        android:layout_marginLeft="15dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="115dp"
        android:layout_marginRight="115dp"
        android:background="@drawable/blackline"
        android:ems="10"
        android:inputType="textPersonName"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toEndOf="@+id/textView3"
        app:layout_constraintTop_toBottomOf="@+id/editTextSchool" />

    <EditText
        android:id="@+id/editTextId"
        android:layout_width="wrap_content"
        android:layout_height="30dp"
        android:layout_marginStart="15dp"
        android:layout_marginLeft="15dp"
        android:layout_marginTop="10dp"
        android:layout_marginEnd="115dp"
        android:layout_marginRight="115dp"
        android:background="@drawable/blackline"
        android:ems="10"
        android:inputType="textPersonName"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toEndOf="@+id/textView4"
        app:layout_constraintTop_toBottomOf="@+id/editTextMajor" />

    <Button
        android:id="@+id/buttonSave"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="29dp"
        android:text="저장"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/editTextId" />

    <TextView
        android:id="@+id/textViewResult"
        android:layout_width="335dp"
        android:layout_height="267dp"
        android:layout_marginStart="36dp"
        android:layout_marginLeft="36dp"
        android:layout_marginTop="26dp"
        android:layout_marginEnd="36dp"
        android:layout_marginRight="36dp"
        android:layout_marginBottom="32dp"
        android:background="#FFFFFF"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/buttonSave" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginLeft="16dp"
        android:layout_marginTop="29dp"
        android:onClick="onButtonClicked"
        android:text="저장2"
        app:layout_constraintStart_toEndOf="@+id/buttonSave"
        app:layout_constraintTop_toBottomOf="@+id/editTextId" />

</android.support.constraint.ConstraintLayout>

result.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#EAEAEA"
    tools:context=".ResultActivity">

    <TextView
        android:id="@+id/textViewResult2"
        android:layout_width="344dp"
        android:layout_height="284dp"
        android:layout_marginStart="20dp"
        android:layout_marginLeft="20dp"
        android:layout_marginTop="28dp"
        android:layout_marginEnd="20dp"
        android:layout_marginRight="20dp"
        android:background="#FFFFFF"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/buttonBack"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="44dp"
        android:text="재입력"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.498"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textViewResult2" />
</android.support.constraint.ConstraintLayout>

MainActivity.java

package com.gkskfhdlstmapk.hanpinetree.a0312_androidsystemprogramming;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {
    EditText editTextName;
    EditText editTextSchool;
    EditText editTextMajor;
    EditText editTextId;
    Button buttonSave;
    TextView textViewResult;


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

        init();

        buttonSave.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String str = editTextName.getText().toString()+"\n"+editTextSchool.getText().toString()+"\n"+editTextMajor.getText().toString()+"\n"+editTextId.getText().toString();
                editTextName.setText(null);editTextMajor.setText(null);editTextSchool.setText(null);editTextId.setText(null);
                textViewResult.setText(str);
            }
        });
    }

    void onButtonClicked(View v){
        Intent intent = new Intent(this, ResultActivity.class);
        intent.putExtra("String",  editTextName.getText().toString()+"\n"+editTextSchool.getText().toString()+"\n"+editTextMajor.getText().toString()+"\n"+editTextId.getText().toString());
        editTextName.setText(null);editTextMajor.setText(null);editTextSchool.setText(null);editTextId.setText(null);
        startActivity(intent);
    }

    void init(){
        editTextName =(EditText)findViewById(R.id.editTextName);
        editTextSchool=(EditText)findViewById(R.id.editTextSchool);
        editTextMajor=(EditText)findViewById(R.id.editTextMajor);
        editTextId=(EditText)findViewById(R.id.editTextId);
        buttonSave = (Button)findViewById(R.id.buttonSave);
        textViewResult = (TextView)findViewById(R.id.textViewResult);
    }
}

Result.java

package com.gkskfhdlstmapk.hanpinetree.a0312_androidsystemprogramming;

import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class ResultActivity extends AppCompatActivity implements View.OnClickListener {
    private String TAG = "Service";
    private Button buttonBack;
    private TextView textViewResult2;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_result);
        init();
        Intent intent = getIntent();
        String result = intent.getStringExtra("String");
        textViewResult2.setText(result);
    }


    void init(){
        Context mContext = this;
        buttonBack = (Button)findViewById(R.id.buttonBack);
        textViewResult2 = (TextView)findViewById(R.id.textViewResult2);
        buttonBack.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.buttonBack:
                finish();
                break;
        }
    }
}

*editText black line으로 둘러싸게 커스텀하기 추가 *

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:padding="10dp"
    android:shape="rectangle"
    >
    <solid android:color="#FFFFFFFF" />

    <stroke
        android:width="2px"
        android:color="#FF000000" />

</shape>

실습 02

반응형