我搜索了很多,我尝试了几种方法,但是找不到任何可以避免错误的方法。
我正在为我的学习工作,在我的MainActivity中有一个字符串,然后我在我的服务中调用它。我试过这样的事情:
下一个进入myService.class
//在我的myService.class中扩展Service
public class myService extends Service{
AlarmManager manager;
PendingIntent pintent;
String te;
@Override
public void onCreate()
{
manager = (AlarmManager)(this.getSystemService(Context.ALARM_SERVICE));
pintent = PendingIntent.getBroadcast( this, 0, new Intent("blahblah"), 0 );}
@Override
public int onStartCommand(Intent intent, int flags, int startid)
{
super.onStartCommand(intent, flags, startid);
te = intent.getStringExtra("tst"); //if I change this line to te = "something", everything goes fine
BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive( Context context, Intent intent )
{
Toast.makeText(getApplicationContext(),te, Toast.LENGTH_SHORT).show();
}
};
this.registerReceiver(receiver, new IntentFilter("blahblah") );
// set alarm to fire 30 min and waits 2 min
manager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + 1000*30*60, 1000*2*60, pintent);
return START_STICKY;}
public IBinder onBind(Intent p1)
{
// TODO: Implement this method
return null;
}
}
此处代码运行完美,但当我退出应用程序时,它崩溃了。 1分钟后,我的设备再次显示我的应用程序崩溃,确认我的应用程序“成功”进入后台。这有什么问题? 我还了解到我可以使用IntentService而不是Service,哪一个对于长任务更好,它们之间有什么区别?
EDIT ***
我收到以下错误:java.lang.NullPointerExeption。 所以我改变了这个:
te = intent.getStringExtra(“tst”);
对此:
试 { te = intent.getStringExtra(“tst”); } catch(NullPointerException e) {}
当我更改它时,我的应用程序可以处理任何错误,但问题是:我需要从我的MainActivity中检索我的String,当我关闭我的应用程序时,我的服务运行没有错误但我的“te”字符串采用null valor,什么我可以在我的服务中“保存”我的字符串,以便能够使用它并在关闭我的应用程序后继续显示“工作”消息吗?我应该使用SharedPreferences吗?
希望我很清楚。
答案 0 :(得分:1)
IntentService
与Service
不同。
IntentService Self在完成任务时终止服务。除非你杀了它,否则服务会永远运行。
对于我的编码经验,我会将IntentService仅用于运行几秒钟的小任务,并使用Service进行长时间运行,并根据需要调用StopSelf()
。
请发布日志以回答您的问题