1

私はJavaに本当に慣れていませんが、経験豊富なC#コーダーです。

アクティビティを開始/停止できるサービスを作成しました。私の質問は、このサービスを「インストール」して、デバイスの起動時に開始するようにするにはどうすればよいですか?

私はこれを見つけました:

Androidの起動時にサービスを開始しようとしています

私はこれを次のように実装しようとしました:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="james.jamesspackage" android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="7" />

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<application android:icon="@drawable/icon" android:label="@string/app_name"
    android:debuggable="true">
    <activity android:name=".jamessActivity" android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <service android:enabled="true" android:name=".MyService">
        <intent-filter>
            <action android:name="james.jamesspackage.MyService" />
        </intent-filter>
        </service>
    <receiver android:name="james.jamesspackage.MyBroadcastReceiver">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
            <category android:name="android.intent.category.HOME" />
        </intent-filter>
    </receiver>
</application>
</manifest>

どうしたの?1つのマニフェストにアクティビティとサービス/レシーバーを含めることはできますか?

ありがとう

ジェームズ

4

2 に答える 2

4

デバイスの起動時にサービスを開始する方法 (自動実行アプリなど)

最初に: Android 3.1 以降のバージョンでは、ユーザーが一度もアプリを起動したことがない場合、またはユーザーが「強制的に閉じた」アプリケーションである場合、BOOT_COMPLETE を受信しません。これは、マルウェアがサービスを自動的に登録するのを防ぐために行われました。このセキュリティ ホールは、新しいバージョンの Android で解決されました。

解決:

アクティビティでアプリを作成します。ユーザーが一度実行すると、アプリは BOOT_COMPLETE ブロードキャスト メッセージを受信できます。

2 番目の場合: 外部ストレージがマウントされる前に BOOT_COMPLETE が送信されます。アプリが外部ストレージにインストールされている場合、BOOT_COMPLETE ブロードキャスト メッセージは受信されません。

この場合、2 つの解決策があります。

  1. アプリを内部ストレージにインストールする
  2. 内部ストレージに別の小さなアプリをインストールします。このアプリは BOOT_COMPLETE を受け取り、外部ストレージで 2 つ目のアプリを実行します。

アプリが内部ストレージに既にインストールされている場合、以下のコードは、デバイスの起動時にサービスを開始する方法を理解するのに役立ちます。


Manifest.xml 内

許可:

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

BOOT_COMPLETED レシーバーを登録します。

<receiver android:name="org.yourapp.OnBoot">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"/>
    </intent-filter>
</receiver>

サービスを登録します。

<service android:name="org.yourapp.YourCoolService" />

レシーバー OnBoot.java 内:

public class OnBoot extends BroadcastReceiver
{

    @Override
    public void onReceive(Context context, Intent intent) 
    {
        // Create Intent
        Intent serviceIntent = new Intent(context, YourCoolService.class);
        // Start service
        context.startService(serviceIntent);

    }

 }

HTC の場合、デバイスが RECEIVE_BOOT_COMPLETED をキャッチしない場合、このコードをマニフェストに追加する必要があるかもしれません。

<action android:name="android.intent.action.QUICKBOOT_POWERON" />

レシーバーは次のようになります。

<receiver android:name="org.yourapp.OnBoot">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"/>
        <action android:name="android.intent.action.QUICKBOOT_POWERON" />
    </intent-filter>
</receiver>

エミュレータまたは実デバイスを再起動せずに BOOT_COMPLETED をテストする方法は? それは簡単です。これを試して:

adb -s device-or-emulator-id shell am broadcast -a android.intent.action.BOOT_COMPLETED

デバイスIDを取得するには?ID を持つ接続されたデバイスのリストを取得します。

adb devices

デフォルトではADTのadbは次の場所にあります。

adt-installation-dir/sdk/platform-tools

楽しみ!)

于 2014-09-24T19:54:04.373 に答える
3

受信者セクションの名前が間違っているようです。AndroidManifest.xml のアプリケーション エントリは次のようになります。

   <application android:icon="@drawable/icon" android:label="@string/app_name">

    <receiver android:name=".BootListener" 
             android:enabled="true" 
             android:exported="false"
             android:label="BootListener">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>

       <service android:name=".UpdateService">
       </service>

       <activity android:name=".Info"
                 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=".TravelMapperPreferences"
              android:label="Settings">
    </activity>        

   </application>

名前は、マニフェスト宣言のパッケージに関連していることに注意してください。マニフェストのパッケージには james.jamesspackage が含まれているため、レシーバー名は「.MyBroadcastReceiver」にする必要があります。

于 2011-05-21T09:10:53.183 に答える