web-dev-qa-db-ja.com

Android:サービスインテントを開始できません:見つかりませんか?

私が知っている、私はこの問題の最初のオンベではありませんが、私は非常に多くの解決策を試みました、私は見つけて誰もうまくいきません...多分あなたはエラーを見つけることができます

エラー(.classがなく、他の設定によっては/.Clientがある場合も同様です)

12-02 16:40:15.359:W/ActivityManager(74):サービスインテント{act = com.Android.fh.EnOceanApp.Client.class}を開始できません:見つかりません

マニフェストでは、これはアプリケーション外のアクティビティに含まれています(アクティビティ内でも ".Client"を使用して試しました)

OnCreate()のコード

    startService(new Intent(this, Client.class)); 

または

 startService(new Intent(this.getApplicationContext(), Client.class));

または

Intent intent=new Intent("com.Android.fh.EnOceanApp.Client.class");
    this.startService(intent);

または

  Intent intent=new Intent("com.Android.fh.EnOceanApp.Client");
    this.startService(intent);

そして今、もうアイデアはありません.... com.Android.fh.EnOceanAppはパッケージ、Client.Javaはこのパッケージのサービスクラスです

そして私が忘れていたマニフェスト:

  <application
        Android:icon="@drawable/ic_launcher"
        Android:label="@string/app_name" >
        <activity
            Android:label="@string/app_name"
            Android:name=".EnOceanAppActivity" >
            <intent-filter >
                <action Android:name="Android.intent.action.MAIN" />

                <category Android:name="Android.intent.category.LAUNCHER" />
            </intent-filter>      
        </activity>

      <activity Android:name=".ListView" 
          Android:label="List View">
      </activity> 
      <activity Android:name=".GraphView" 
          Android:label="Graph View">
      </activity>
      <service 
            Android:name=".Client"></service> //with and without ., of course without this comment
    </application>
16
nico

ですから、最終的には他の人を助けるかどうかだけです。

私は新しいプロジェクトを作成し、ソースをコピーして実行しようとしました。サービスが見つかりました。違いは何でしたか、つまり、パッケージ名が長いか、com.Android .で始まるという問題が発生する可能性があります。新しいプロジェクトでは、com.enoceanを選択しました

2
nico

ユーザーに感謝njzk2何が起こっているのか知らせてくれてありがとう。

同じ問題がありました。 Android OSは、プロジェクトのマニフェストファイルに以前に登録していない場合、リクエストしたサービスクラスを見つけることができません。

サービスはアクティビティのようなものですが、グラフィックインターフェースはありません。これは、サービスを使用する前に登録する必要があることを意味します

これは、Androidプロジェクトにサービスを登録する方法です。

<application>
    <!-- your code -->
    <activity>
        <!-- your code  -->
        <intent-filter>
            <action Android:name="Android.intent.action.MAIN" />
            <category Android:name="Android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <service Android:name="com.your.own.service.class"></service>
</application>

YourServiceクラスはServiceから拡張する必要があることを忘れないでください。

public class YourService extends Service{}
21
AXSM

場合によっては、ショートフォーム(.classname)を使用するのではなく、マニフェストでクラス名を完全に修飾する必要があります。別のパッケージのクラスを使用したときにそれが見られましたが、サービスインテントがアプリの外に移動する可能性があるため、おそらくここで役立つでしょう。

4

この投稿のすべての回答と関連する多くの サービスインテントを開始できません:見つかりませんサービスインテントを開始できません にもかかわらず、私はまだ苦労していて、取得するのにしばらく時間がかかりましたこれは行く。私が使用しているDIFFERENTアプリでサービスを開始しようとしているため、私のシナリオは少し複雑でした。私はそれを理解しました、そしてここにいくつかのボーナスコードとともにすべての詳細があります。

MainActivity呼び出しインテント(またはどこでも)

Intent intent=new Intent("com.example.core.MusicService.1234");
//Or Intent intent=new Intent("com.example.core.MusicService.TOGGLE_PLAYBACK");
PendingIntent pendingIntent = PendingIntent.getService(this, 99, intent, PendingIntent.FLAG_CANCEL_CURRENT);

サービスのマニフェスト:(アプリケーションタグ内のサービスタグ)

    <service Android:name="com.example.core.MusicService">
        <intent-filter>
            <action Android:name="com.example.core.MusicService1234"></action>
        </intent-filter>
        <intent-filter>
            <action Android:name="com.example.core.MusicService.TOGGLE_PLAYBACK"></action>
        </intent-filter>
    </service>

MusicService.Java

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    if(intent != null){
        if(intent.getAction() != null){
            if(intent.getAction().contentEquals("com.example.core.MusicService.TOGGLE_PLAYBACK")){
                //Do work here
            }
        }
    }
}

注意事項

  • サービスを開始する必要はありません。このインテントはそれを開始します
  • 「com.example.core.MusicService1234」と「com.example.core.MusicService.TOGGLE_PLAYBACK」は何でもかまいませんが、サービスマニフェストのインテントフィルターを呼び出しインテントと一致させる必要があることは明らかです。これらを複数配置して、サービスの開始時に、インテントの値に応じて異なるアクションを実行できます
  • 99は何でもかまいませんが、通知を使用する場合は一意である必要があります
  • インテントフィルターを使用せずに別のアプリ(このような)でサービスを呼び出すことが可能かどうかはわかりません。そうである場合は、誰かに教えてください。試してみましたがうまくいきません。

クレジット:すべての投稿からの累積情報:)

1
Kevin

誰かがこれを見て、私と同じ問題を抱えている場合は、ガイドに従ってcontext.startService()の代わりにcontext.startActivity()を使用したことが原因でした

0
JamEngulfer

まあ、私の場合、私はプロジェクトをきれいにしなければなりませんでした。パッケージ/プロジェクトでサービスの新しいJavaクラスを作成したが、あとでプロジェクトをビルド/クリーンアップしなかった場合に発生することがあります。私の場合、プロジェクトをクリーンアップしなければなりませんでしたエラーを取り除きます。

0
kzs

Androidのバカ間違いです

これは機能しません

<service
            Android:name=".classname"/>

しかし、これは機能します、別個の終了タグがあります

<service
            Android:name=".classname"></service>
0
arun-r

マニフェストの別のタグにタグを追加するという愚かな間違いを犯しました。

その場合、現在のアプリケーションは定義されたサービスを見つけることができませんでした。

その間違いをスキップしてください:)

ありがとう。

0
Otpidus