4

我是 android 新手,我已经创建了这样的意图 -

<receiver android:name=".IncommigCallListener" >
      <intent-filter>
             <action android:name="android.intent.action.PHONE_STATE" />
      </intent-filter>
</receiver>
<receiver android:name=".OutgoingCallReciever" >
         <intent-filter>
              <action android:name="android.intent.action.NEW_OUTGOING_CALL" />
         </intent-filter>
</receiver>

现在我创建了这样的服务-

<service
       android:name=".CallLogger"
       android:exported="false"/>

班级CallLogger

public class CallLogger extends IntentService {
    public CallLogger(String name) {
        super(name);
        // TODO Auto-generated constructor stub
    }

    @Override
    protected void onHandleIntent(Intent arg0) {
        // TODO Auto-generated method stub
        System.out.println("service started");
    }
}

我不想在我的应用程序中进行任何活动,我只想启动该服务,以便它可以在后台工作并接收PHONE_STATENEW_OUTGOING_CALL意图。

当我启动此应用程序时,它不会记录任何内容PHONE_STATENEW_OUTGOING_CALL意图。

如何在不使用任何活动的情况下在后台启动服务?

编辑 :

public class OutgoingCallReciever extends BroadcastReceiver {
    @Override
    public void onReceive(Context ctx, Intent intent) {
         String number = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
    }
}

public class IncommigCallListener extends PhoneStateListener {
    @Override
    public void onCallStateChanged(int state, String incomingNumber) {
        switch (state) {
        case TelephonyManager.CALL_STATE_RINGING:
            String incommingCallNumber = incomingNumber;
            System.out.println("incomming call : " + incomingNumber);
            break;
        }
    }
}
4

3 回答 3

2

只需在 BroadcastReceiver 的 onReceive 方法中启动服务即可。当您在 AndroidManifist 中注册 BroadcastReceiver 时,即使应用程序未运行(操作系统将为您运行它),它也会始终侦听广播。 例子

 public class MyReceiver extends BroadcastReceiver {

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

编辑 要在启动完成时启动服务,您可以执行以下操作。

1) 为您的 Manifist 添加权限:

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

2) 使用 BOOT COMPLETE 操作注册您的广播接收器。

<receiver android:name="com.example.BootBroadcastReceiver">  
    <intent-filter>  
        <action android:name="android.intent.action.BOOT_COMPLETED" />  
    </intent-filter>  
</receiver>

3) 在 BootBroadcastReceiver.java 中:

public class BootBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Intent serviceIntent = new Intent(context, MyService.class);
        context.startService(serviceIntent );
    }
}
于 2013-05-29T13:24:16.073 回答
1

您应该能够在接收器中执行类似的操作。

public class OutgoingCallReciever extends BroadcastReceiver {
    @Override
    public void onReceive(Context ctx, Intent intent) {
         String number = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);
         Intent service = new Intent(context, CallLogger.class);
         context.startService(service);
    }
}

您需要创建一个意图并在其上调用 startService() 以“启动”服务。

此外,您应该摆脱System.out.println使用Log.d(tag,msg)将调试信息打印到 logcat 的习惯。d如果您想在不同的通道中打印,您可以切换到其他字母。

于 2013-05-29T13:24:31.713 回答
0

为什么什么都没有打印只是由于System.out.println在Android中不起作用的问题!你觉得后台进程哪里会“ print”这个东西?

您需要将其更改为Log.d(tag, msg)然后检查您的 logcat 以查看输出!否则我猜你的代码可能运行正常。

于 2014-11-08T17:53:10.990 回答