在手机睡着的时候接短信

时间:2013-01-11 06:38:56

标签: android

我有一个接收短信的应用程序(通过BroadCastReceiver)并启动一个活动来处理传入的短信(包括播放声音以通知用户,更新数据库并向用户显示消息)。

问题是,有时候应用程序没有运行且手机处于睡眠状态,我什么也没收到,但是一旦解锁屏幕,我就会收到4或5条消息!

编辑: BroadcastReceiver的定义:

    <receiver
        android:name=".util.sms.SmsReceiver"
        android:enabled="true" >
        <intent-filter android:priority="999" >
            <action android:name="android.intent.action.DATA_SMS_RECEIVED" />
            <data android:scheme="sms" />
            <data android:port="56790" />
        </intent-filter>
    </receiver>

我的活动定义:

    <activity
        android:name=".MyActivity"
        android:launchMode="singleInstance">
    </activity>

内部活动:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
            // ...
            handleNewMessage(this.getIntent());
    }


@Override
public void onNewIntent (Intent intent) {
    super.onNewIntent(intent);
    handleNewMessage(intent);       
}

从BroadcastReceiver启动MyActivity:

@Override
public void onReceive(Context context, Intent intent) {
        //...
        if( smsIsMine() ) {
    Intent intent = new Intent();
    intent.putExtra("MESSAGE_BODY", sms.getBody());
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.setClass(context, MyActivity.class);
    context.startActivity(intent);                
        }
    }

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

在Manifest中注册您的Receiver。像这样:

<receiver android:name="com.app.SMSReceiver" android:enabled="true"> 
        <intent-filter android:priority="999"> 
            <action android:name="android.provider.Telephony.SMS_RECEIVED"/> 
        </intent-filter> 
    </receiver>

答案 1 :(得分:0)

解决方案是使用WakeLock,如下所示“

@Override
public void onReceive(Context context, Intent intent) {
    PowerManager powerManager = (PowerManager)                             context.getSystemService(Context.POWER_SERVICE);
    PowerManager.WakeLock wl = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "");
    wl.acquire();
    // your code ...
    wl.release();
}