アプリの自動起動

アプリを指定の時間に自動で起動したい場合はAlermManagerクラス、Serviceクラス、BroadReceiverクラスの3つを主に使います。

手順は以下のとおりです。

  1. 呼び出したいアクティビティを作る
  2. AlertManagerクラスに対して指定時間に呼び出すサービスを追加する
  3. Serviceクラスから指定時間にメッセージをレシーバクラスに送信する
  4. Receiverクラスからアクティビティを起動する
  5. マニュフェストファイルの設定

呼び出すアクティビティの作成

ここでは次のような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秒後に呼ばれる設定にしています。

その後、AlarmManagersetメソッドでサービスがその時刻に呼び出されるように設定すれば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.xmlapplicationタグ間に次の内容を追加します。

<?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)の追加を行っています。

また、レシーブに関してはサービスから送信されるメッセージの設定も行う必要があります。

関連項目