0

マイアプリを続行することができません。WakefulBroadcastReceiver startWakefulServiceはwakefulbroadcastreceiver</p> <p>マニフェストからintentservice要求を呼び出しません

私はメインクラスmsgReqAction(でメソッドを呼び出すことができますので、私は、メインクラス内のサブクラスとしてこれらを持っている私のメインの活動の内部

public class WearableReceiver extends WakefulBroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Intent service = new Intent(context, WearableReceiverService.class); 
     startWakefulService(context, service); 
    } 
} 

public class WearableReceiverService extends IntentService { 

    public WearableReceiverService(){ 
     super("WearableReceiverService"); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     msgReqAction(intent.getIntExtra(MyConstants.BROADCAST_DATA_REQ, 0)); 
     WearableReceiver.completeWakefulIntent(intent); 
    } 
} 

私は、サブクラスが妨げなければならないとして、これらを持つとは思いません状況が、それは可能性があります。私が手術のためにメインクラスの外にこれらを持っていなければならないと私に知らせてください。

最終的に私は私のプロジェクトがcom.example.johnbravado.zionworkある

ウェアラブル

@Override 
public void onMessageReceived(final MessageEvent messageEvent) { 
    nodeId = messageEvent.getSourceNodeId(); 
    String incomingPath = messageEvent.getPath(); 
    int incomingReq = Integer.parseInt(new String(messageEvent.getData())); 

    if(incomingPath.equalsIgnoreCase(MyConstants.MSG_COUNTER_REQ_PATH)) { 
     Intent broadcastIntent = new Intent(); 
     broadcastIntent.setAction(MyConstants.BROADCAST_ACTION_RESP); 
     broadcastIntent.addCategory(Intent.CATEGORY_DEFAULT); 
     broadcastIntent.putExtra(MyConstants.BROADCAST_DATA_REQ, incomingReq); 
     sendBroadcast(broadcastIntent); 

    }else if(incomingPath.equalsIgnoreCase(MyConstants.MSG_DEFAULT_PATH)){ 

    } 
} 

public static final String BROADCAST_ACTION_RESP = "com.example.johnbravado.zionwork.MESSAGE_PROCESSED"; 
からのメッセージをリッスンする主な活動外のリスナーからの全体のプロセスを開始 - また、サイドノートではあり変更してリファクタリングする方法をアンドロイドスタジオで簡単にできるように私は例を取り除くか、または完全に変更することができますか?

私は、システムが

startWakefulService(context, service); 

へのすべての方法は、それが意図サービスを入力せずにクラッシュを取得デバッガを実行します。私はそれがサービスに入って仕事をするのを妨げているすべての中で、簡単に私が行方不明になっているsomethigです。私はそれがサービスに全く入っていないことが分かります。私は、サービス

@Override 
protected void onHandleIntent(Intent intent) { 
    int data; 
    data = 0; 
    data++; 
    msgReqAction(intent.getIntExtra(MyConstants.BROADCAST_DATA_REQ, 0)); 
    WearableReceiver.completeWakefulIntent(intent); 
} 

のいくつかのイントロラインを追加し、これらのラインにデバッグポイントを実行しようと、それはそこに着くdidntの。

答えて

0

Serviceを静的でない内部クラスとして定義することはできません。

非静的な内部クラスは、その外部クラスへの参照を含みます。つまり、内部クラスの新しいインスタンスを作成するには、外部クラスのインスタンスが必要です。

AndroidがあなたのServiceを起動しようとすると、内部クラスの新しいインスタンスを作成しようとします。 Androidには作成に使用する外部クラスのインスタンスがないため、これは失敗します。

BroadcastReceiverにも同じ規則が適用されます。

解決方法:すべての内部クラスを(独自のソースファイル内の)本格的なクラスに移動します。

+0

私はその外部サービスからmsgReqAction()を呼び出すことができます。デバイスがスリープモードになったときの主なアクティビティを処理するためのサービスポイント。または、実際の方法は、サービスが参照できる静的変数をいくつか作成し、onResume()が呼び出されたときの主なアクティビティで、眠っている間に何が起こったかで必要なものを実行することです。 –

+0

あなたは不正行為をして、 'Activity'が自分自身への参照を' static'変数に格納して、 'Service'がそのメソッドを呼び出せるようにすることができます。しかし、これは悪い習慣です。通常、 'Service'は、' Intent'( 'Activity'がリッスンしている)を送信するか、' Activity'を 'Service'にバインドし、' Service'からのコールバックを ' AIDLを使用するか、EventBus(パブリッシュ/サブスクライブフレームワーク)のようなものを使用して、「アクティビティ」 –

+0

私はそれが私の放送受信機がやっていることだと思った。 wakefulbroadcastを通常のブロードキャストと交換し、セカンダリサービスの使用を取り除き、ブロードキャストレシーバーでmsgReqaction()を処理するだけで動作するでしょう。または、放送受信機をメインのアクティビティと一緒に使用するにはどうすればいいですか? –

0

解決策は、WakefulfulBroadcastReceiverとセカンダリIntentServiceを削除することでした。代わりに、私はBroadcastReceieverを使用し、Wearableリスナー関数から直接ブロードキャストを送信し、それを使用してアクティビティ内で直接データを処理しました。

public class WearableReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     //Intent service = new Intent(context, WearableReceiverService.class); 
     //startWakefulService(context, service); 
     PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE); 
     PowerManager.WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, 
       "com.example.johnbravado.zionwork"); 
     wakeLock.acquire(); 
     // Do Work 
     msgReqAction(intent.getIntExtra(MyConstants.BROADCAST_DATA_REQ, 0)); 

     wakeLock.release(); 
    } 
} 

私は必ずしもウェークロックを必要としません。後でもっと仕事をすることに決めたら、私は準備ができている。私はこれがwakelockのために最善の場所であるかどうかは分かっていません。

マニフェストファイルの余分なサービスと受信者への参照も削除しました。今すぐうまく動作します

関連する問題