アプリの自動起動
アプリを指定の時間に自動で起動したい場合はAlermManagerクラス、Serviceクラス、BroadReceiverクラスの3つを主に使います。
手順は以下のとおりです。
- 呼び出したいアクティビティを作る
- AlertManagerクラスに対して指定時間に呼び出すサービスを追加する
- Serviceクラスから指定時間にメッセージをレシーバクラスに送信する
- Receiverクラスからアクティビティを起動する
- マニュフェストファイルの設定
呼び出すアクティビティの作成
ここでは次のようなActivityクラスを自動起動します。
public class AutostartActivity extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView textView = new TextView(this); textView.setText("自動起動しました。"); setContentView(textView); } }
1つのテキストビューを持つアクティビティ(AutostartActivity)です。これを別のアクティビティから自動起動させるのが目標です。
サービスをAlermManagerに追加する
次に呼び出し元のアクティビティクラスでAlermManagerクラスに対して独自に作ったAutorunServiceクラス(後述)をサービスとして追加します。
ここでは10秒後に自動起動するように設定します。
public class MainActivity extends Activity { private PendingIntent mAlarmSender; private Context ct; private AutorunService my_service; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //レイアウトを設定 ct = getApplicationContext(); my_service = PendingIntent.getService(ct, -1, new Intent(ct, AutorunService.class), PendingIntent.FLAG_UPDATE_CURRENT); //AutorunService(後述)の取得 AlarmManager am = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE); am.set(AlarmManager.RTC_WAKEUP, System.getTimeInMills() + 10000, my_service); //AlarmManagerにサービスを追加 } }
Calendarクラスに対してcurrentTimeMillisメソッドから現在時刻を取得し、それに10秒(10000ミリ秒)足したものをsetTimeInMillisメソッドに渡してサービスが10秒後に呼ばれる設定にしています。
その後、AlarmManagerのsetメソッドでサービスがその時刻に呼び出されるように設定すればAlarmManagerの処理は完了です。
サービスクラスの作成
では、AlarmManagerの設定が終わったあとは次にサービスクラスを作成します。
ここではAutorunServiceというクラス名でServiceクラスを拡張したものをつぎのようにして作ります。
public class AutorunService extends Service { public IBinder onBind(Intent intent) { return null; } public void onCreate() { Thread thread = new Thread(null, task, "AutorunServiceThread"); thread.start(); Log.vi("AutorunService : ", "スレッドスタート"); } //実行されるスレッド Runnable task = new Runnable() { public void run() { Intent alarmBroadcast = new Intent(); alarmBroadcast.setAction("MyAlarmAction"); //このサービスのアクション名を設定 sendBroadcast(alarmBroadcast); //レシーバに"MyAlarmAction"というメッセージを送信 TimerIntentService.this.stopSelf(); //サービスを停止する。 } }; }
レシーバークラスの作成
次にサービスから送信されたメッセージを受け取りアクティビティを実行するレシーバクラス(AutorunReceiverクラス)を作成します。
次のようにBroadcasrReceiverクラスを拡張して作りました。
public class AutorunReceiver extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { Intent notification = new Intent(context, AutostartActivity.class); //起動するアクティビティを取得 notification.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(notification); //アクティビティを起動 } }
AutostartActivityを起動するアクティビティからIntentインスタンスを作り、startActivityでそれを起動しています。
マニュフェストファイルの設定
最後にアプリのマニュフェストファイルに変更を加えます。
以下のようにAndroidManifest.xmlのapplicationタグ間に次の内容を追加します。
<?xml version="1.0" encoding="utf-8" ?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.MyTimers.mytimers"
android:versionCode="1"
android:versionName="1.0" >
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.MyApp.myapp.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="com.MyTimers.mytimers.AutostartActivity"
android:launchMode="singleInstance" >
</activity>
<!--グループタイマの自動起動したら呼ばれる画面(AutostartActivity)
メインのウインドウと別タスクで起動する。-->
<service android:name=".AutorunService" />
<!-- メッセージを送るサービス -->
<receiver
android:name=".AutorunReceiver" >
<intent-filter>
<action android:name="AutorunServiceAction" />
<!-- サービスからのメッセージ -->
</intent-filter>
</receiver>
<!-- メッセージを受け取り、AutostartActivityを起動するレシーバ -->
</application>
</manifest>
1つめのactivityの終了タグの後からが追加する内容です。
起動するアクティビティの追加と、サービス(service)とレシーブ(receive)の追加を行っています。
また、レシーブに関してはサービスから送信されるメッセージの設定も行う必要があります。