【发布时间】:2017-03-25 04:40:13
【问题描述】:
即使应用程序关闭,我也想在后台运行应用程序。当有人收到短信时,我需要阅读短信。为此,我使用IntentService 和BroadcastReceiver 但我不知道为什么代码不起作用。这是我的代码。
清单
<uses-permission android:name="android.permission.SEND_SMS"/>
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
<uses-permission android:name="android.permission.READ_SMS"/>
<!-- Other code -->
<service android:name=".ServiceCommunicator"/>
MainActivity
// Inside onCreate method
Intent intent = new Intent(this, ServiceCommunicator.class);
startService(intent);
ServiceCommunicator
public class ServiceCommunicator extends IntentService
{
private SMSreceiver mSMSreceiver;
private IntentFilter mIntentFilter;
public ServiceCommunicator(){
super("ServiceCommunicator");
}
@Override
protected void onHandleIntent(Intent intent) {
mSMSreceiver = new SMSreceiver();
mIntentFilter = new IntentFilter();
mIntentFilter.addAction("android.provider.Telephony.SMS_RECEIVED");
registerReceiver(mSMSreceiver, mIntentFilter);
}
private class SMSreceiver extends BroadcastReceiver
{
private final String TAG = this.getClass().getSimpleName();
@Override
public void onReceive(Context context, Intent intent)
{
Bundle extras = intent.getExtras();
String strMessage = "";
if ( extras != null )
{
Object[] smsextras = (Object[]) extras.get( "pdus" );
for ( int i = 0; i < smsextras.length; i++ )
{
SmsMessage smsmsg = SmsMessage.createFromPdu((byte[])smsextras[i]);
String strMsgBody = smsmsg.getMessageBody().toString();
String strMsgSrc = smsmsg.getOriginatingAddress();
strMessage += "SMS from " + strMsgSrc + " : " + strMsgBody;
Log.i(TAG, strMessage);
// Show Alert
int duration = Toast.LENGTH_LONG;
Toast toast = Toast.makeText(context,
"senderNum: "+ strMsgSrc + ", message: " + strMsgBody, duration);
toast.show();
}
}
}
}
}
这段代码有什么问题。即使用户关闭应用程序,我也想运行此代码。
【问题讨论】:
-
你要先注册brodcast,在onmessage接收方法启动intent服务
-
IntentServices 在onHandleIntent()完成后停止。请改用常规的Service。不过,你真的不需要这样做。如果您没有在清单注册的接收器中收到该广播,那么可能还有其他事情发生,您应该首先进行补救。例如:确保您在安装后,在收到消息之前至少运行了一次应用程序,以使其退出 stopped 状态;检查您的设备是否有任何其他可能限制第三方应用程序在后台接收短信的设置/权限;等 -
@MikeM。我在 mainfest 文件中注册了广播接收器,并创建了一个从
Broadcastreceiver扩展的公共类SMSreceiver,当我运行我的应用程序时它工作正常,但是当我关闭应用程序时它也停止读取短信。这是我之前发布的question,但有人说我需要IntentService。我是android新手,请你看看这个问题。 -
是的,我看到了这个问题,这就是为什么我提到清单注册的接收器。正如我所提到的,请确保在安装后运行您的应用程序一次,并检查您的设备是否存在可能干扰的非标准权限或设置。此外,如果您通过强制停止应用程序来关闭应用程序,那么在您下次运行应用程序之前,清单中的接收器将无法再次工作。这是设计使然,从 Android 版本 3.1 开始。
-
应用程序运行良好,即使它处于恢复状态。但是关闭后就不行了。我不明白你说的强制停止是什么意思。我只是照常关闭应用程序。我正在使用
Huawei y5ii电话我认为不需要任何额外的权限。
标签: android android-broadcastreceiver android-intentservice