在后台聆听意图

JAV*_*eek 5 service android android-intent

我是 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>
Run Code Online (Sandbox Code Playgroud)

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

<service
       android:name=".CallLogger"
       android:exported="false"/>
Run Code Online (Sandbox Code Playgroud)

班级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");
    }
}
Run Code Online (Sandbox Code Playgroud)

我不想在我的应用程序中进行任何活动,我只想启动该服务,以便它可以在后台工作并接收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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Adn*_*nan 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);
    }
   } 
Run Code Online (Sandbox Code Playgroud)

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

1)向您的 Manifist 添加权限:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
Run Code Online (Sandbox Code Playgroud)

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

<receiver android:name="com.example.BootBroadcastReceiver">  
    <intent-filter>  
        <action android:name="android.intent.action.BOOT_COMPLETED" />  
    </intent-filter>  
</receiver>
Run Code Online (Sandbox Code Playgroud)

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 );
    }
}
Run Code Online (Sandbox Code Playgroud)