- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 intentservice 完成后,我无法将对象传回。我的目标是在发送通知后将 currentCharacter 对象发送回 Mainactivity。我用 onResult 尝试过,但 intentservice 没有这个。我也尝试创建一个自己的 resultreceiver 但是当我实现它时,通知甚至没有通过。有谁知道这个问题的解决方案或解决方法?
这是当我进入特定区域时从 MainActivity 调用的 GeofenceTransitionIntentService。我有一个 currentCharacter 对象,我想将其发送回 MainActivity,我在 MainActivity 中也有一个 currentCharacter,但这需要更新。
public class GeofenceTransitionIntentService extends IntentService {
protected static final String TAG = "MainActivity";
private boolean checkedIn = false;
private List<Store> stores;
private Store rightStore;
private Character currentCharacter;
private ResultReceiver rec;
/**
* This constructor is required, and calls the super IntentService(String)
* constructor with the name for a worker thread.
*/
public GeofenceTransitionIntentService() {
// Use the TAG to name the worker thread.
super(TAG);
}
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, "onCreate: geofencetransition");
}
/**
* Handles incoming intents.
*
* @param intent sent by Location Services. This Intent is provided to Location
* Services (inside a PendingIntent) when addGeofences() is called.
*/
@Override
protected void onHandleIntent(Intent intent) {
GeofencingEvent geofencingEvent = GeofencingEvent.fromIntent(intent);
if (geofencingEvent.hasError()) {
String errorMessage = "err";
Log.e(TAG, errorMessage);
return;
}
// Get the transition type.
int geofenceTransition = geofencingEvent.getGeofenceTransition();
if(!checkedIn) {
// Test that the reported transition was of interest.
if (geofenceTransition == Geofence.GEOFENCE_TRANSITION_ENTER ||
geofenceTransition == Geofence.GEOFENCE_TRANSITION_EXIT) {
// Get the geofences that were triggered. A single event can trigger multiple geofences.
List<Geofence> triggeringGeofences = geofencingEvent.getTriggeringGeofences();
// Get the transition details as a String.
String geofenceTransitionDetails = getGeofenceTransitionDetails(
geofenceTransition,
triggeringGeofences
);
stores = new Gson().fromJson(intent.getStringExtra("stores"),
new TypeToken<ArrayList<Store>>() {
}.getType());
// Send notification and log the transition details.
sendNotification(geofenceTransitionDetails);
currentCharacter = new Gson().fromJson(intent.getStringExtra("char"),
Character.class);
rec = intent.getParcelableExtra("receiverTag");
String date = new SimpleDateFormat("dd/MM/yyyy", Locale.ENGLISH).format(Calendar.getInstance().getTime());
Checkin checkin = new Checkin(rightStore, date, 10);
currentCharacter.getCheckins().add(checkin);
currentCharacter.setCurrentExp(currentCharacter.getCurrentExp() + checkin.getReceivedExp());
putCharacter();
Log.d(TAG, geofenceTransitionDetails);
} else {
// Log the error.
Log.d(TAG, "error");
}
}
}
/**
* Gets transition details and returns them as a formatted string.
*
* @param geofenceTransition The ID of the geofence transition.
* @param triggeringGeofences The geofence(s) triggered.
* @return The transition details formatted as String.
*/
private String getGeofenceTransitionDetails(
int geofenceTransition,
List<Geofence> triggeringGeofences) {
String geofenceTransitionString = getTransitionString(geofenceTransition);
// Get the Ids of each geofence that was triggered.
ArrayList<String> triggeringGeofencesIdsList = new ArrayList<>();
for (Geofence geofence : triggeringGeofences) {
triggeringGeofencesIdsList.add(geofence.getRequestId());
}
String triggeringGeofencesIdsString = TextUtils.join(", ", triggeringGeofencesIdsList);
return geofenceTransitionString + triggeringGeofencesIdsString;
}
/**
* Posts a notification in the notification bar when a transition is detected.
* If the user clicks the notification, control goes to the MainActivity.
*/
private void sendNotification(String notificationDetails) {
Intent notifyIntent;
notifyIntent = new Intent(getApplicationContext(), StoresDetail.class);
for(Store store : stores){
if(notificationDetails.contains(store.getName())){
rightStore = store;
}
}
notifyIntent.putExtra("store", rightStore);
notifyIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent pendingIntent = PendingIntent.getActivities(getApplicationContext(), 1234,
new Intent[] { notifyIntent }, PendingIntent.FLAG_UPDATE_CURRENT);
Notification notification = new Notification.Builder(this)
.setSmallIcon(R.drawable.logo)
.setContentTitle(notificationDetails)
.setContentText("Gamification")
.setAutoCancel(true)
.setContentIntent(pendingIntent)
.build();
notification.defaults |= Notification.DEFAULT_SOUND;
NotificationManager notificationManager =
(NotificationManager) this.getSystemService(this.NOTIFICATION_SERVICE);
notificationManager.notify(5678, notification);
}
/**
* Maps geofence transition types to their human-readable equivalents.
*
* @param transitionType A transition type constant defined in Geofence
* @return A String indicating the type of transition
*/
private String getTransitionString(int transitionType) {
switch (transitionType) {
case Geofence.GEOFENCE_TRANSITION_ENTER:
checkedIn = true;
return "Entered geofence: ";
case Geofence.GEOFENCE_TRANSITION_EXIT:
checkedIn = false;
return "Exited geofence: ";
default:
return "default";
}
}
private void putCharacter(){
RequestQueue queue = Volley.newRequestQueue(getApplicationContext());
Gson gson = new Gson();
APIService caller = new APIService();
caller.put(queue, "character/", gson.toJson(currentCharacter), new VolleyCallback() {
@Override
public void onSuccess(String result) {
Log.d("GeofenceTransitionSer", "onSuccess of VolleyCallback, Method: putCharacter");
}
@Override
public void onFailed(String result) {
Log.d("GeofenceTransitionSer", "onFailed of VolleyCallback, Method: putCharacter");
}
});
}
最佳答案
通过您的代码,您确实通过 getParcelableExtra() 检索了 ResultReceiver,但我没有看到您使用 rec.send(int,Bundle);
MainActivity 永远不会收到通知。这就是为什么通知可能不会像您所说的那样通过。
关于android - IntentService 不适用于 resultreceiver,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42157776/
我有一个包含很多歌曲的 ListView 。每次点击一首歌曲时,我都会调用一个 IntentService 来按顺序下载这首歌曲。 但有时我想取消下载(例如:第 5 次)。这意味着我需要停止第 5 个
我有这个 IntentService (HttpService),它从网络服务中获取原始 json 数据: public class HttpService extends IntentService
我想将回调传递给 IntentService。这是我当前的代码: 我的回调接口(interface) import android.os.Message; public interface Sampl
在我的 Android 应用程序中,我有一个带有适配器的简单 ListView 。有一个繁重的查询是用数据填充 ListView 。所以我把它放到另一个线程中运行的 IntentService 中。
我只想写一个“Hello World IntentService App”。不幸的是,我无法做到这一点。 问题: MyIntentService.enqueueWork() 方法不起作用。 Inten
我有 5 个 IntentServices,它们在与主 UI 不同的时间和单独的进程中运行。当服务完成时,它们通过 Intent 将数据发送到主进程。我想知道 5 个服务是否占用了我的应用程序过多的内
我正在构建一个应用程序,通知将在特定时间响起,如果无人看管 15 分钟,通知就会消失。当我插入设备并运行代码时它就可以工作。然而,一旦我拔掉设备并运行应用程序,通知就会起作用,但如果无人看管,它不会在
我构建了一个应用程序,它使用 IntentService 来操作应用程序的数据库和调用网络服务。 例子: 我有一个 Activity ,它是一个项目列表。此列表由 CursorAdapter 填充。每
我遇到了一个问题。 IntentService UpdateService02 偶尔会运行失败。我放入了日志条目以便进行调试,这就是我得到的... 02-28 21:37:32.461: Main -
我正在使用 IntentService 执行后台任务,例如从远程服务器更新数据。 在某些情况下,同一个请求可以被用户多次排队,但我只想执行一次(连续两次从服务器更新数据没有意义)。 是否有使用 Int
我正在使用 Android AlarmManger 安排 IntentService 在较小的间隔后运行。 这是我的 AlarmManger: static void setNextSchedule(
我的 IntentService 看起来像这样: public class MusicService extends IntentService{ final static String NA
我遇到了一个奇怪的情况,我构建的对象在方法 onHandleIntent 中返回为 null,我不知道为什么或如何解决它。 我的 Activity @Override protected vo
我搜索了很多,但我不知道如何在单击按钮时停止 IntentService。我有一个启动 IntentService 的按钮,然后 progressDialog 显示通过 ResultReceiver
我正在尝试用 Kotlin 编写一个 CallRecorder 应用程序。我想要做的是开始使用 BroadcastReceiver 启动的服务录制音频。我认为我在 MediaRecorder 初始化方
只是想阐明我对 IntentService 在达到 terminating 状态后如何由操作系统管理的理解。通过终止,我的意思是当当前 Activity 被销毁或应用程序进程被终止时,根据以下文档:
我正在使用 IntentService 访问不同的网络服务方法并更新我的 ContentProvider。我看到的问题是,有时,我向 IntentService 发送了一个新的 Intent,但是 I
我想我明白了 IntentService 类的意义。它处理一个队列,防止太多或更多的服务实例一起执行。 我发现它很有用,但是如果我从 IntentService 派生了太多具有不同用途的类,并且我希望
我有一个 IntentService,它在启动时启动并在后台保持运行。没有启动器 Activity,IntentService 由广播接收器调用。它适用于 2.3.4 和 4.0.4 设备,但不适用于
我编写了一个发送命令行的 IntentService。与我尝试对控制台进行编程的 Activity 有关。该 Activity 的目的是执行“命令提示符”,我可以在其中向服务器发送消息或从服务器接收消
我是一名优秀的程序员,十分优秀!