在后台监听意图

5

我是一个Android新手,我创建了如下的Intent -

<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"/>

Class 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;
        }
    }
}
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)在您的清单文件中添加权限:

<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 );
    }
}

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切换到其他字母。

0

为什么没有任何东西被打印出来,只是因为System.out.println在Android中不起作用!你认为后台进程会在哪里“打印”这个东西?

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接