在android上关闭应用程序时,使用alarmmanager设置的Asynctask失败
当我的应用程序打开时,我有一个非常好的在android上关闭应用程序时,使用alarmmanager设置的Asynctask失败,android,android-asynctask,alarmmanager,Android,Android Asynctask,Alarmmanager,当我的应用程序打开时,我有一个非常好的ASyncTask,但是你知道当你按住手机上的home(主页)按钮并通过滑动来关闭应用程序时吗?它崩溃了 我的AlarmReceiverclass public class Alarm-Receiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { final Context errorContext =
ASyncTask
,但是你知道当你按住手机上的home(主页)按钮并通过滑动来关闭应用程序时吗?它崩溃了
我的AlarmReceiver
class
public class Alarm-Receiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent)
{
final Context errorContext = context;
final UP refUP = new UP(); //just an activity for my toast
class NotifRequest extends AsyncTask<String, Void, String[]> {
String NotifUrlStr = String.format(errorContext.getString(R.string.notification_url), Main.Text);
@Override
protected String[] doInBackground(String... params) {
String[] On = new String[2];
String onProd = "";
String sonOnTar = "";
try {
JSONTokener onTokener = new JSONTokener(Sources.httpConnGet(NotifUrlStr).toString());
JSONArray onArray=new JSONArray(onTokener);
JSONObject json_obj_on = onArray.getJSONObject(0);
onProd = json_obj_on.getString("on");
if(onProd .equals("0") == false) {
sonOnTar = json_obj_on.getString("sonon");
}
} catch (Exception e) {
refUP.runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(errorContext, "Error!", Toast.LENGTH_LONG).show();
}
});
CancelAlarm(errorContext);
}
On[0] = onProd;
On[1] = sonOnTar;
return On;
}
@Override
protected void onPostExecute(String[] onRes) {
String onSay = onRes[0];
String onTar = onRes[1];
if (onSay.equals("0") && onSay != null) {
NotificationCompat.Builder mBuilder =
new NotificationCompat.Builder(errorContext)
.setSmallIcon(R.drawable.akilli_launcher)
.setContentTitle("New")
.setContentText("new");
Intent resultIntent = new Intent(errorContext, UPSiparisler.class);
PendingIntent resultPendingIntent =
PendingIntent.getActivity(
errorContext,
0,
resultIntent,
PendingIntent.FLAG_UPDATE_CURRENT
);
mBuilder.setContentIntent(resultPendingIntent);
int mNotificationId = 001;
NotificationManager mNotifyMgr =
(NotificationManager) errorContext.getSystemService(Context.NOTIFICATION_SERVICE);
mNotifyMgr.notify(mNotificationId, mBuilder.build());
}
super.onPostExecute(onRes);
}
}
NotifRequest notReq = new NotifRequest();
notReq.execute();
}
public void SetAlarm(Context context)
{
AlarmManager am=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent i = new Intent(context, AlarmNotifReceiver.class);
PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 10*1000, pi); // Millisec * Second
}
public void CancelAlarm(Context context)
{
Intent intent = new Intent(context, AlarmNotifReceiver.class);
PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, 0);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarmManager.cancel(sender);
}
}
公共类报警接收器扩展广播接收器{
@凌驾
公共void onReceive(上下文、意图)
{
最终上下文errorContext=上下文;
final UP refUP=new UP();//这只是我的祝酒词
类NotifRequest扩展异步任务{
String NotifUrlStr=String.format(errorContext.getString(R.String.notification_url),Main.Text);
@凌驾
受保护字符串[]doInBackground(字符串…参数){
字符串[]打开=新字符串[2];
字符串onProd=“”;
字符串sonOnTar=“”;
试一试{
JSONTokener onTokener=新的JSONTokener(Sources.httpConnGet(NotifUrlStr.toString());
JSONArray onArray=新JSONArray(onTokener);
JSONObject json_obj_on=onArray.getJSONObject(0);
onProd=json_obj_on.getString(“on”);
如果(onProd.equals(“0”)==false){
sonOnTar=json_obj_on.getString(“sonon”);
}
}捕获(例外e){
refUP.rununuithread(新的Runnable(){
公开募捐{
Toast.makeText(errorContext,“Error!”,Toast.LENGTH_LONG.show();
}
});
取消报警(errorContext);
}
On[0]=onProd;
On[1]=sonOnTar;
回报;
}
@凌驾
受保护的void onPostExecute(字符串[]onRes){
字符串onSay=onRes[0];
字符串onTar=onRes[1];
if(onSay.equals(“0”)&&onSay!=null){
通知相容建筑商mBuilder=
新建NotificationCompat.Builder(errorContext)
.setSmallIcon(R.drawable.akilli_发射器)
.setContentTitle(“新”)
.setContentText(“新”);
Intent resultIntent=新的Intent(errorContext,upsiparsler.class);
悬而未决的结果悬而未决的结果=
pendingent.getActivity(
errorContext,
0,
结果,
PendingEvent.FLAG_更新_当前
);
mBuilder.setContentIntent(resultPendingContent);
int mNotificationId=001;
通知经理mNotifyMgr=
(NotificationManager)errorContext.getSystemService(Context.NOTIFICATION\u服务);
mNotifyMgr.notify(mNotificationId,mBuilder.build());
}
super.onPostExecute(onRes);
}
}
NotifRequest notReq=新的NotifRequest();
notReq.execute();
}
公共无效设置报警(上下文)
{
AlarmManager am=(AlarmManager)context.getSystemService(context.ALARM\u服务);
意图i=新意图(上下文,AlarmNotifReceiver.class);
PendingIntent pi=PendingIntent.getBroadcast(上下文,0,i,0);
am.setRepeating(AlarmManager.RTC_WAKEUP,System.currentTimeMillis(),10*1000,pi);//毫秒*s
}
公共无效取消报警(上下文)
{
意向意向=新意向(上下文,AlarmNotifReceiver.class);
PendingEvent发送方=PendingEvent.getBroadcast(上下文,0,意图,0);
AlarmManager AlarmManager=(AlarmManager)context.getSystemService(context.ALARM\u服务);
alarmManager.cancel(发送方);
}
}
即使在应用程序关闭且不继续显示Toast
错误后,我该如何做才能使其正常工作
提前感谢。在您的活动中,当活动移动到停止状态时,您应该尝试取消您的
异步任务,如下所示:
@Override
public void onStop() {
super.onStop();
notReq.cancel(true);
}
我假设当活动不可见时,您不需要完成任务。我需要,正如我说过的,我希望它在应用程序运行时也能工作。关门了。虽然我刚刚发现我不能像这样简单地定义字符串。String NotifUrlStr=String.format(errorContext.getString(R.String.notification_url),Main.Text);你对此有什么建议吗?我的问题是在一个不适用的类中使用getString()方法,我该如何使用它?试试errorContext.getResources().getString(R.string.notification\u url)
我试过了,但我还需要在,在这样的类中如何保存Main.Text字符串?Main.Text在何处初始化?