サービス
サービスとはバックグラウンドで操作するアプリケーションである。
裏で動作し続ける。こわっ・・・・普段当たり前に利用してるアプリもこういうのあるんだよなぁ・・・・後で中身見直すか。
下図はServiceのライフサイクル
コード
メイン
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 |
import 色々; public class MainActivity extends Activity { Button btnStart; Button btnStop; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findView(); addEvent(); } private void findView() { btnStart = (Button) findViewById(R.id.button1); btnStop = (Button) findViewById(R.id.button2); } private void addEvent() { btnStart.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, MyService.class); // 定期的に呼び出す PendingIntent pendingIntent = PendingIntent.getService(MainActivity.this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); int type = AlarmManager.RTC; long millis = System.currentTimeMillis(); long interval = AlarmManager.INTERVAL_FIFTEEN_MINUTES; alarmManager.setInexactRepeating(type, millis, interval, pendingIntent); // ただ呼び出す // startService(intent); } }); btnStop.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, MyService.class); // 定期的に呼び出しているものを終了させる PendingIntent pendingIntent = PendingIntent.getService(MainActivity.this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); alarmManager.cancel(pendingIntent); // ただ止める // stopService(intent); } }); } } |
サービス用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
import 色々; public class MyService extends Service { // サービス作成時の処理 @Override public void onCreate() { super.onCreate(); Toast.makeText(this, "Service onCreate", Toast.LENGTH_SHORT).show(); } // サービスが開始時の処理 // 戻り値はサービスが強制終了した時の動作を返す。 @Override public int onStartCommand(Intent intent, int flags, int startId) { Toast.makeText(this, "Service onStartCommand", Toast.LENGTH_SHORT).show(); // 今回はLogに0~999まで表示させる。ここは表面上は表示されない。 for (int i = 0; i < 1000; i++) { Log.d("TAG", "Service" + i); } return super.onStartCommand(intent, flags, startId); } // サービス破棄時の処理 @Override public void onDestroy() { super.onDestroy(); Toast.makeText(this, "Service onDestroy", Toast.LENGTH_SHORT).show(); } // bindService()時に呼び出されるメソッド。今回は利用されていないがServiceには実装必須 @Override public IBinder onBind(Intent intent) { Toast.makeText(this, "Service onBind", Toast.LENGTH_SHORT).show(); return null; } } |
Serviceを利用できるようにする
AndroidManifest.xmlを開き、
アプリケーションタブ > Application Nodes(枠内最下部) > 追加 > Nameの参照 > 作成したServiceの選択
ミュージックプレイヤーの作成
説明はコード内に少しだけ入ってます。
手抜きでサーセン。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
import 色々; public class MainActivity extends Activity { MediaPlayer mp; Button btnStart; Button btnStop; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findView(); // 音楽をセットする mp = MediaPlayer.create(MainActivity.this, R.raw.renketukessan); addEvent(); } private void findView() { btnStart = (Button) findViewById(R.id.button1); btnStop = (Button) findViewById(R.id.button2); } private void addEvent() { // 再生ボタン btnStart.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (mp != null) { mp.setVolume(100, 100); // 左右の音量 mp.start(); // 再生 Toast.makeText(MainActivity.this, "再生を開始しました", Toast.LENGTH_SHORT).show(); } } }); // 停止ボタン btnStop.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (mp.isPlaying()) { mp.stop(); // 停止 try { mp.prepare(); // 再再生できるように準備しておく } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } Toast.makeText(MainActivity.this, "再生を停止しました", Toast.LENGTH_SHORT).show(); } } }); } // アプリがバックグラウンドに入った時 @Override protected void onPause() { super.onPause(); Log.d("TAG", "onPause"); if (mp.isPlaying()) { // 再生中だったら mp.stop(); Toast.makeText(MainActivity.this, "再生を停止しました", Toast.LENGTH_SHORT).show(); } mp.release(); // MediaPlayerの破棄 } } |
パズルを作る
9つのピースを入れ替えながら完成を目指すパズルの制作。
完成イメージ(というかレイアウト)
コード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
import 色々; public class MainActivity extends Activity implements OnClickListener { final static int PIECES = 9; // imageView の idの入った配列 ※imageViewが並び順通りになっているかR.javaを確認すること final int ivId[] = {R.id.imageView1,R.id.imageView2,R.id.imageView3,R.id.imageView4,R.id.imageView5,R.id.imageView6,R.id.imageView7,R.id.imageView8,R.id.imageView9}; // 画像のリソースidの入った配列 final int resId[] = {R.drawable.image1,R.drawable.image2,R.drawable.image3,R.drawable.image4,R.drawable.image5,R.drawable.image6,R.drawable.image7,R.drawable.image8,R.drawable.image9}; // imageViewの配列 ImageView[] ivs = new ImageView[PIECES]; int clickedIndex; // クリックされたところの番号が入る boolean isClicked = false; // 最初はクリックされてない private ArrayList<Integer> nums; // 並び順を管理する配列 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findView(); } private void findView() { for (int i = 0; i < PIECES; i++) { // 回しながらロード ivs[i] = (ImageView) findViewById(ivId[i]); } shuffle(); } // 混ぜる(起動時とシャッフルボタン押下時 private void shuffle() { nums = new ArrayList<Integer>(); for (int i = 0; i < PIECES; i++) { nums.add(i); } Collections.shuffle(nums); for (int i = 0; i < PIECES; i++) { ivs[i].setImageResource(resId[nums.get(i)]); ivs[i].setOnClickListener(this); } } @Override public void onClick(View v) { swapPanel(v.getId()-R.id.imageView1); // 1枚目なら0 } // パネルの入れ替え @SuppressWarnings("deprecation") private void swapPanel(int pNum) { if (isClicked) { // 2枚目の処理 int temp = nums.get(clickedIndex); nums.set(clickedIndex, nums.get(pNum)); nums.set(pNum, temp); ivs[pNum].setImageResource(resId[nums.get(pNum)]); ivs[clickedIndex].setImageResource(resId[nums.get(clickedIndex)]); ivs[pNum].setAlpha(0xFF); ivs[clickedIndex].setAlpha(0xFF); for (int i = 0; i < PIECES; i++) { // 0->0,1->1...となったら終わり if (i != nums.get(i)) { // 違う場所があったらフラグを反転してもう一回 isClicked = !isClicked; return; // メソッドを抜ける } } // ここにくるということは完成 Toast.makeText(this, "そろいました!", Toast.LENGTH_SHORT).show(); } else { // 1枚目の処理 // 1枚目を押した時点ではisClickedがfalseなため必ずここを通る clickedIndex = pNum; // ivs[pNum].setAlpha(0x90); // 半透明処理 } // 2枚目がifを通るためにisClickedを反転させる // 2枚目の選択で通る場合は次の選択が1枚目になるように反転 isClicked = !isClicked; } // シャッフルボタン public void bt_shuffle(View v) { nums = null; // 管理配列を空にしてやり直し shuffle(); } // 答えボタン public void bt_ans(View v) { for (int i = 0; i < PIECES; i++) { nums.set(i, i); // 0~8が順番に配列に格納される ivs[i].setImageResource(resId[i]); // resIdに沿って並ばせるだけなので完成形になる。 } } // 終了ボタン public void bt_end(View v) { finish(); // アプリの破棄 } } |
コメント
No Trackbacks.