我正在编写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。 无论如何,如果还有其他办法,我仍然有疑问。