将数据发送到BroadcastReceiver(CONNECTIVITY_CHANGE)以从中访问数据库

时间:2016-06-27 15:42:33

标签: android email broadcastreceiver connectivity

我正在编写Geofence应用程序。当用户到达某个点时,地理围栏触发并发送邮件。 这非常完美。但我需要控制没有连接​​的情况,以便应用程序在连接可用时发送邮件。

我用广播接收器实现了这个目的,它侦听了CONNECTIVITY_CHANGE。

我的问题我需要从数据库中检索详细信息(邮件和文本的接收者),为此我需要一个" ID",但我可以&# 39;找到将此ID传递给BroadcastReceiver的方法。

这是我的代码:

我有一个检测地理围栏的Intent,如果没有互联网,则激活BroacasReceiver:

public class GeofenceIntentService extends IntentService implements com.google.android.gms.location.LocationListener {

[...]

@Override
protected void onHandleIntent(Intent intent) {
    GeofencingEvent geofencingEvent = GeofencingEvent.fromIntent(intent);

    extras = intent.getExtras();

    Log.e(TAG, String.valueOf(extras.getLong("id")));

    ID = extras.getLong("id");

  sendMail(ID);

    }
}

[...]

private void sendMail(long ID) {

    dbHelper = new DBHelper(context);
    dbHelper.getWritableDatabase();

    cursor = dbHelper.getRegister(ID);

    dbHelper.close();


    tomail = cursor.getString(cursor.getColumnIndex("tomail"));
    where = cursor.getString(cursor.getColumnIndex("where"));
    texttosend = cursor.getString(cursor.getColumnIndex("texttosend"));

    if (getConnectivityStatus(context) == 1 || getConnectivityStatus(context) == 2) {

                Mail m = new Mail("***", "****");

                String[] toArr = {tomail};
                m.setTo(toArr);
                m.setFrom("*****");
                m.setSubject(getString(R.string.justtrying));
                m.setBody(texttosend);


                try {

                    if (m.send()) {
                        Log.v(TAG, "Email was sent successfully.");

                   } else {
                        Log.v(TAG, "Email was not sent.");
                    }
                } catch (Exception e) {

                    Log.e("MailApp", "Could not send email", e);
                }
            } else {
                Log.v(TAG, "Waiting for Internet Connection.");

          registerForBroadcasts(context);

            }
}

public void registerForBroadcasts(Context context) {
    ComponentName component = new ComponentName(context, NetworkChangeReceiver.class);
    PackageManager pm1 = context.getPackageManager();
    pm1.setComponentEnabledSetting(
            component,
            PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
            PackageManager.DONT_KILL_APP);
}

然后是清单上的接收者:

<receiver
        android:name=".NetworkChangeReceiver"
        android:enabled="false"
        android:label="NetworkChangeReceiver">
        <intent-filter>
            <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
        </intent-filter>
    </receiver>

正如我所说,这有效,但接下来,我需要知道ID以获取发送邮件的联系信息。广播作为一个Intent变量,但我不知道如何编辑它。这就是这个想法:

@Override
public void onReceive(final Context context, final Intent intent) {

    final Context mContext = context;

    String action = intent.getAction();
    extras = intent.getExtras();
    ID = extras.getLong("id");

有什么想法吗?我能找到的唯一选择是从GeofenceIntent每隔30秒检查一次连接,但我认为听取连接变化会更有效。

修改 最后,我通过添加&#34;待定&#34;解决了这种情况。列,数据库和BroadcastReceiver检查所有寄存器,其中Pending = true。 无论如何,如果还有其他办法,我仍然有疑问。

0 个答案:

没有答案