Java(Android)のService, Application(Context)

AndroidにてActivityにまたがる処理を行う処理を記述するには、Bound Serviceを使う必要がある。bindeServiceの引数ServiceConnectionのコールバック関数onServiceConnectedにて渡されるIBinderでServiceオブジェクトを取得し、必要なメソッドを実行できる。 SQLiteへの保存処理をこれで行おうと考えたのだが、そのためのSQLiteOpenHelperにはContextが必須となっている。 ServiceはActivity(Contextを継承する)に依存したくないために利用しているので、そのままContextを取得できない。 必要なメソッドの引数に都度Contextを指定する手も無くはないが、メソッドが増えるほど面倒さが増すし、そもそもDatabaseへのconnectの条件としてcontextが必要なので、メソッドの呼び出しの都度Databaseへの再接続が発生してしまう。 ApplicationもContextを継承している。これならどこからでも呼び出せそうだが、Applicationインスタンスを取得するにはActivityのメソッドを呼び出す必要がある… ということで、Applicationを継承した独自クラスを作成し、Singletonとしてインスタンスを取得すると良いとわかった。よく使われている手法らしい。 http://kazuooooo.hatenablog.com/entry/2015/10/18/200949 これら独自Service, Applicationを利用する際の注意事項として、Application.manifestに宣言をしないといけない。これを忘れるとそれらをインスタンス化できずにnullになってExceptionが発生するが、エラー内容を一見してApplication.manifestが原因だとは判別できない。 Androidの各種メソッド・ライブラリには、この手のContext前提のものが多い。今回のSQLiteのライブラリに関しては内部で呼び出しているFileアクセスがContext前提となっているためのようだ。ただ、それがなぜContext前提にする必要があるかは理解できていない。C#のWPF, UWP関連でも似たような制限があった気がするので、現代的なアプリ開発には必要なセキュリティなどのための必須仕様なのかもしれない。

<span title='2018-12-02 01:00:00 +0900 +0900'>December 2, 2018</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;tack41

NECのEXPRESSSCOREのJavaアプレットが動かない

当社ではNEC製サーバを導入しているのだが、NECサーバではサーバのステータス確認や設定変更にEXPRESSSCOREというWebコンソールが利用できる。 これが、一部機能がJavaアプレットで動く仕様になっている、今時… BIOS等の更新が出ているので適用しようと思い、現在のバージョンを確認しようとすると、このアプレットか、サーバを再起動して起動画面で確認するしかない… 今時Javaアプレットが動くのはIEかSafariくらい。JREは8までしかサポートしない。 Windows 7 のIEでなんとか動かそうとするのだが、反応しない。 通常のブラウザで確認できる画面にsshの項目があり、これを有効にしたところsshでログインできた。ほしいバージョン情報も取得できた。 ただ、このまま開放しとくのも気持ち悪いので、必要なときだけsshを有効にする運用とした。

<span title='2018-11-19 00:00:00 +0900 +0900'>November 19, 2018</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;tack41