サービス

python-for-androidはAndroidサービスの使用をサポートしてバックグラウンドタスクは別々のプロセスで実行されます。 これらはAndroid上でのマルチプロセッシングに最も類似しています。 Androidプラットフォームでは通常のマルチプロセッシングを使用できません。 アプリが現在ユーザーによって開かれていないときにも、サービスはコードを実行する唯一の方法です。

サービスはAPKをビルドする際に宣言する必要があります。 それぞれに独自のmain.pyファイルがあり、Pythonスクリプトが実行されます。 アプリを使用してサービスプロセスと通信ができます。 例: osc または twisted (重いオプション)。

サービスを作成する

APKにサービスを含めるには2通りの方法があります。

サービスフォルダー

この基本的な方法は、新しいSDL2と古いPygameブートストラップの両方で動作します。 可能であれば、以下の2番目の方法を使用することをお勧めします

アプリケーションディレクトリに service という名前のフォルダを作成し、 service/main.py ファイルを追加します。 このファイルには、サービスを実行するPythonコードが含まれている必要があります。

サービスを開始するには、 android モジュールの start_service 関数を使用します(この方法を使用する場合は、Pygameブートストラップに自動的に含まれています。SDL2を使用して要件に手動で追加する必要があります):

import android
android.start_service(title='service name',
                      description='service description',
                      arg='argument to service')

任意のサービススクリプト

注釈

このサービス方法は、Pygameブートストラップでは サポートされていません

この方法は、柔軟性が高く、複数のサービスをサポートし、幅広いオプションをサポートするため、サービスの軽微な使用に推奨されます

サービスを作成するには、サービスコードでpythonスクリプトを作成し、python-for-androidを呼び出すときに --service=myservice:/path/to/myservice.py 引数を追加します。 コロンの前にある myservice の名前は、サービスクラスの名前です。このクラスを使用して後でやりとりします。 複数の --service 引数を追加して複数のサービスを追加できます。これらのサービスは、後でアプリケーションから停止して開始できます。

サービスを実行する(つまりmain appのコード内からサービスを開始する))にはPyJNIusを使ってPython-for-androidが作成するJavaクラスと相互作用する必要があります。

from jnius import autoclass
service = autoclass('your.package.name.ServiceMyservice')
mActivity = autoclass('org.kivy.android.PythonActivity').mActivity
argument = ''
service.start(mActivity, argument)

ここで your.package.name はあなたのAPKのパッケージ識別子を --package 引数でpython-for-androidに設定したものを指しておりサービスの名前は ServiceYourservicename です。 Yourservicename は 最初の大文字のサービス引数です。 また、(ここのように)空の文字列であっても argument パラメータを渡す必要があります。 それを渡すと、サービスはこの引数を利用できます

サービスは、ここではまだ文書化されていないが、すべて service リファレンスの他のメソッドを呼び出すことでアクセス可能なさまざまなオプションと呼び出すことをサポートしています

注釈

Pythonのインポート用のアプリケーションルートディレクトリはサービスファイルがサブフォルダ内にあってもアプリケーションのルートフォルダにあります。 サービスフォルダからインポートするには、たとえば、サービスファイルが service/ フォルダ内にある場合は、import module の代わりに service.module をインポート します。