Android アプリ開発「MATRIX」

Androidアプリの開発に役立つサンプル集


【暗黙の仕様】AlarmManager のリピート間隔を「1分以下」にすることは不可能

AlarmManagerクラスのリピート間隔

AlarmManagerクラスには、指定した間隔で繰り返しアラームを発報することができる「setRepeating」「setInexactRepeating」というパブリックメソッドがありますが、この2つのメソッドのリピート間隔を1分以下にしようとしても無視され、プログラムコード上は1分以下になっていても内部的に1分間隔に修正されてしまうようです。

以下のような短い間隔での発報は不可能…

MyAlarmmanager.setRepeating(AlarmManager.RTC,SystemClock.currentThreadTimeMillis(),5000,pendingIntent);
MyAlarmmanager.setInexactRepeating(AlarmManager.RTC,SystemClock.currentThreadTimeMillis(),5000,pendingIntent);

備考・その他

過去には数秒という短い間隔でアラームの発報ができたようですが、仕様が変わったのか現在はそれができないようです。1分以下の短い間隔で処理を繰り返したい場合は他の方法を使用する必要があります。

END

【Android 9】requires android.permission.FOREGROUND_SERVICE エラーが発生する場合の対処方法

Android 9「フォアグラウンドサービス」の変更点

Android 9 以降は「フォアグラウンドサービス」を使用する際に、マニフェストファイルでパーミッションを要求しなければなりません。パーミッションを要求しないままアプリを起動すると「requires android.permission.FOREGROUND_SERVICE」エラーが発生してアプリが強制終了します。

フォアグラウンド サービス

Android 9 以降をターゲットにするアプリは、フォアグラウンド サービスを使用する際に FOREGROUND_SERVICE パーミッションをリクエストする必要があります。 これは Normal パーミッションなので、リクエストしたアプリに自動で付与されます。

Android 9 以降をターゲットにするアプリが FOREGROUND_SERVICE をリクエストせずに、フォアグラウンド サービスの作成を試みると、システムにより、SecurityException がスローされます。

※公式開発サイトより抜粋

このエラーの対処方法

マニフェストファイルで「FOREGROUND_SERVICE」パーミッションを要求してください。

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

これでエラーによる強制終了を回避することができます。

END

ブロードキャストレシーバーに「has no zero argument constructor」というエラーが出た場合の対処方法

ブロードキャストレシーバーのエラー

ブロードキャストレシーバー(BroadcastReceiver)を使ったアプリを開発している時に「has no zero argument constructor」というエラーが発生してブロードキャストレシーバーが正常に動作しない場合があります。

対処方法

このエラーの対処方法は以下になります。

public class MyBroadcastReceiver extends BroadcastReceiver {

「public」と「class」の間に「static」を追加する

public static class MyBroadcastReceiver extends BroadcastReceiver {

備考・その他

static」はブロードキャストレシーバーを別ファイルにしなかった場合(他のクラス内に記述した場合)に追加する必要があるようです。

END

新しいアクティビティを開始する

新しいアクティビティを開始する

新しいアクティビティを開始するには「startActivity()」メソッドを使います。

サンプルコード(MainActivity.java)

※詳しい説明はコード内のコメントを参照してください。

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Viewにレイアウトファイルをセット
setContentView(R.layout.activity_main);
// レイアウトファイルのボタンを取得
Button button = (Button)findViewById(R.id.button);
// ボタンにクリックイベントをセット
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// インテントを作成
Intent intent = new Intent(getBaseContext(),NewActivity.class);
// アクティビティを開始する
startActivity(intent);
}
});
}
}

備考・その他

「finishActivity()」メソッドで終了するアクティビティを開始する場合は「startActivityForResult()」メソッドを使用します。

END

現在のアクティビティを終了する

現在のアクティビティを終了する

現在のアクティビティを終了するには「finish()」メソッドを呼び出します。

サンプルコード(MainActivity.java)

※詳しい説明はコード内のコメントを参照してください。

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Viewにレイアウトファイルをセット
setContentView(R.layout.activity_main);
// レイアウトファイルのボタンを取得
Button button = (Button)findViewById(R.id.button);
// ボタンにクリックイベントをセット
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// ボタンがクリックされたら現在のアクティビティを終了する
finish();
}
});
}
}

備考・その他

以前開始した別のアクティビティを終了する場合は「finishActivity()」メソッドを使用します。

END