1

電話に発信通話があるときにサービスを実行しようとしています。しかし、何らかの理由で、これが発生するとサービスが実行されません。「CallReceiver」のコードが実行されることはわかっています。これは、トースト メッセージが実行された場合に表示するために使用したためです。メイン アクティビティを通じてサービスを実行できますが、これは発信呼び出しが行われるかどうかに関係なく実行されることを意味します....

以下は私のコードです:

受信機:

package com.example.hiworld;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.Toast;

public class CallReceiver extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) {
        context.startService(new Intent(context, CallService.class));

        Toast.makeText(context, "Call Receiver started",
                Toast.LENGTH_LONG).show();

        Log.d("Calling Someone", "onReceived");

    }


}

サービス:

package com.example.hiworld;


import android.app.IntentService;
import android.content.Context;
import android.content.Intent;
import android.telephony.TelephonyManager;
import android.widget.Toast;

public class CallService extends IntentService  {

    public long StartTime=0;
    public long EndTime =0; 
    public long TotalTime = 0; 
    public long NumFreeMins = 0;


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

    @Override
    protected void onHandleIntent(Intent intent) {


        StartTime = (System.currentTimeMillis())/60;

        TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);




            if(tm.getCallState()==0) //getting the time whenever the phone is off 
            {

                EndTime = (System.currentTimeMillis())/60;
                TotalTime = EndTime-StartTime;
                 NumFreeMins = 300-TotalTime; 

                 //notify user
                 this.displaymsg();

            }   



    }

public void displaymsg()
{
    Toast toast = Toast.makeText(getApplicationContext(), ""+NumFreeMins, Toast.LENGTH_SHORT);
    toast.show();
}
}

私は何人かの人々が次の行を使用しているのを見てきました:

context.startService(new Intent(this, CallService.class));

それ以外の:

context.startService(new Intent(context, CallService.class));

しかし、後者は私にはうまくいきません...

4

2 に答える 2

1

特定の「アクション」のマニフェストで<intent-filter>for yourを指定してみてください。IntentService例...

<service
    android:name=".CallService" >
    <intent-filter>
        <action android:name="com.example.hiworld.intent.DO_SOMETHING" />
    </intent-filter>
</service>

次に、onReceive(...)あなたの方法でBroadcastReceiver次のようなことをします...

Intent callReceiverIntent = new Intent("com.example.hiworld.intent.DO_SOMETHING");

// Put the Intent received by the BroadcastReceiver as extras so the
// IntentService can process it...
callReceiverIntent.putExtras(intent);

context.startService(callReceiverIntent);

編集:

あなたがpasrebinに投稿したコードに基づいて、簡単なテストアプリを作成しました。マニフェスト、レシーバー、サービスのコードを同一に保ち、実行するにはデフォルトを追加するだけで済みActivityました。

Eclipse の DDMS パースペクティブで logcat を監視すると、 が をCallReceiver正常に受信NEW_OUTGOING_CALL Intentし、実際にCallService.

Toastただし、問題は、 fromを表示しようとするIntentServiceと、「漏れたハンドラー」が原因で例外が発生し、静かにクラッシュすることです。

この背後にある理由IntentServiceは、バックグラウンド スレッドを使用してその作業を実行しToast、非 UI スレッドから (つまり、UI 要素) を表示しようとしても、アプリには UI コンポーネントが実行されていないため機能しないためです。したがって、ローカルcontext変数またはを使用するかどうかに関係なくgetApplicationContext()Toast.

CallServiceから を開始するときに機能する理由は、 が で使用できる UI コンテキストを提供するActivityためです。要するに、が常にUI コンポーネントによって起動されていない限り、からを使用しようとすることはお勧めできません。その場合でも、バックグラウンド スレッドで UI 要素 ( など) を作成すると、問題が発生する可能性があります。ActivityToastToastIntentServiceIntentServiceToast

これを現在のモデルで動作させる唯一の方法は、 を に変更するIntentServiceことServiceです。デフォルトでは、 a のコード実行はメイン (UI) スレッドで行われ、アプリの表示の有無に関係なく、 a が aを表示するServiceことは完全に合法です。実際、a を使用するようにコードを変更し、 からコードを配置したところ、発信コールを行うときに が表示されます。ServiceToastActivitiesServiceonHandleIntentonStartCommand()Toasts

于 2012-07-10T22:56:38.490 に答える
0

試す

context.startService(new Intent(context.getApplicationContext(), CallService.class));
于 2012-07-10T22:35:29.517 に答える