S ペンが取り外されたときにすぐにアプリケーションを開きたいのですが、onSPenDetached の下に置かれたメソッドが、アプリケーションが再び開かれたときにのみ呼び出される場合、どうすればよいですか?
ありがとう、チャンドゥ
以下は、Android 5.0.2 を実行している S-Pen (SM-P550) を搭載した私の Galaxy Tab A 9.7 で動作します。
スタイラスを取り付けたり取り外したりすると、取り外した場合とデバイスに戻した場合の名前がcom.samsung.pen.INSERT
booleanExtra のタイプのブロードキャスト インテントが作成されます。penInsert
false
true
したがって、この種のイベントをフィルター処理するブロードキャスト レシーバーを作成できます。次のコードは、スタイラスが取り外された場合に OneNote を起動するブロードキャスト レシーバー用です。
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class SPenDetachIntentBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent penInsertIntent) {
if (!penInsertIntent.getBooleanExtra("penInsert", true)) {
try {
Intent launchIntent = context.getPackageManager().getLaunchIntentForPackage("com.microsoft.office.onenote");
context.startActivity(launchIntent);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
com.samsung.pen.INSERT
マニフェスト ファイルでは、インテント フィルターを使用してブロードキャスト インテントをリッスンするレシーバーとして宣言する必要があります。プロジェクトのAndroidManifest.xml
declaresの次のエントリはSPenDetachBroadcastReceiver
、インスタンスを生成し、com.samsung.pen.Insert
ブロードキャスト インテントをリッスンします。
<receiver
android:name=".SPenDetachIntentBroadcastReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.samsung.pen.INSERT" />
</intent-filter>
</receiver>
オブジェクトを使用registerSPenDetachmentListener
してメソッドを実装して を登録する場合の利点は、追加のライブラリ ファイルが必要なく、追加のアクセス許可も必要ないことです。SPenEventLibrary
Service
onSPenDetached
と を作成する必要がありBroadcastReceiver
ますService
。
サービス:
public class SPenService extends Service {
SPenEventLibrary mSPenEventLibrary = new SPenEventLibrary();
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
super.onCreate();
mSPenEventLibrary.registerSPenDetachmentListener(this, new SPenDetachmentListener() {
@Override
public void onSPenDetached(boolean bDetached) {
if (bDetached) {
Toast.makeText(SPenService.this, "S Pen Detached", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(SPenService.this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
} else {
Toast.makeText(SPenService.this, "S Pen Inserted", Toast.LENGTH_SHORT).show();
}
}
});
}
@Override
public void onDestroy() {
super.onDestroy();
mSPenEventLibrary.unregisterSPenDetachmentListener(this);
}
}
受信機:
public class SPenReceiver extends BroadcastReceiver {
@Override
public void onReceive(final Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(Intent.ACTION_BOOT_COMPLETED)) {
context.startService(new Intent(context, SPenService.class));
}
}
}
マニフェスト (<application>
タグ内):
<receiver android:name=".SPenReceiver" >
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
<service android:name=".SPenService" >
</service>