Android服务停止运行一段时间后请帮助(Android Service Stops Running After Awhile Please Help)
我有一个永远循环的服务,但不知何故,它随着时间的推移它死亡或循环结束。 我已经有一段时间了,任何建议或建议都会非常感激。 谢谢!
以下是服务的启动方式
Intent myIntent = new Intent(this, MyService.class); pendingIntent = PendingIntent.getService(this, 0, myIntent, 0); AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE); Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); calendar.add(Calendar.SECOND, 10); alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
这是服务的Onstart命令
@Override public int onStartCommand(Intent intent, int flags, int startId) { try{ //Toast.makeText(getApplicationContext(), " Service Started", Toast.LENGTH_LONG).show(); @SuppressWarnings({ "rawtypes", "unchecked" }) AsyncTask<Void, Void, Void> asyncTask = new AsyncTask() { @Override protected void onPreExecute() { } @Override protected Void doInBackground(Object... objects) { //Get Username from sql not static value. Static value could die. String Username = ""; SQLiteDatabase db; db = openOrCreateDatabase(".db",SQLiteDatabase.CREATE_IF_NECESSARY,null); db.setVersion(1); db.setLocale(Locale.getDefault()); db.setLockingEnabled(true); Cursor cur =db.query("userdata", null, null, null, null, null, null); cur.moveToFirst(); while(cur.isAfterLast()==false){ Username = (cur.getString(cur.getColumnIndex("username"))); cur.moveToNext(); } cur.close(); db.close(); int messagecount = -1; //START MAIN LOOP TO CHECK NEW MESSAGES /* * Counts starts at -1 then gets count then if 1 is * added to newcount newcount is > than last message count * notify uesers. */ for(;;){ try{ String result = ""; //Shownotify();//WILL LOOP ALL THE TIME: LOOP TEST HttpClient client = new DefaultHttpClient(); HttpPost request = new HttpPost("http:GetInfo.php"); List<NameValuePair> postParameters = new ArrayList<NameValuePair>(); postParameters.add(new BasicNameValuePair("UserName", Username)); UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(postParameters); request.setEntity(formEntity); HttpResponse response = client.execute(request); HttpEntity entity = response.getEntity(); InputStream is = entity.getContent(); BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8); StringBuilder sb = new StringBuilder(); String line = null; while((line = reader.readLine())!= null){ sb.append(line + "\n"); } is.close(); result = sb.toString(); JSONArray jArray = new JSONArray(result); int newcount = 0; for(int i=0;i<jArray.length(); i++){ JSONObject json_data = jArray.getJSONObject(i); newcount = json_data.getInt("counter"); } if(MyGlobalInformation.getStopLoop() == true){ break; } if(newcount > messagecount && messagecount != -1){ messagecount = newcount; Shownotify(); } else{ messagecount = newcount; } } catch(Exception e){ HomeScreen.setStartedState(false); } } return null; } @Override protected void onPostExecute(Object o) { HomeScreen.setStartedState(false); } }; asyncTask.execute(); } catch(Exception e){ HomeScreen.setStartedState(false); } return START_STICKY; }
I have a service in a for ever loop but somehow over time it either dies or the loop ends. I been at this for a while, any advice or suggestions would be very appreciative. Thanks!
Here is how the service is started
Intent myIntent = new Intent(this, MyService.class); pendingIntent = PendingIntent.getService(this, 0, myIntent, 0); AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE); Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); calendar.add(Calendar.SECOND, 10); alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
And here is the Onstartcommand for the Service
@Override public int onStartCommand(Intent intent, int flags, int startId) { try{ //Toast.makeText(getApplicationContext(), " Service Started", Toast.LENGTH_LONG).show(); @SuppressWarnings({ "rawtypes", "unchecked" }) AsyncTask<Void, Void, Void> asyncTask = new AsyncTask() { @Override protected void onPreExecute() { } @Override protected Void doInBackground(Object... objects) { //Get Username from sql not static value. Static value could die. String Username = ""; SQLiteDatabase db; db = openOrCreateDatabase(".db",SQLiteDatabase.CREATE_IF_NECESSARY,null); db.setVersion(1); db.setLocale(Locale.getDefault()); db.setLockingEnabled(true); Cursor cur =db.query("userdata", null, null, null, null, null, null); cur.moveToFirst(); while(cur.isAfterLast()==false){ Username = (cur.getString(cur.getColumnIndex("username"))); cur.moveToNext(); } cur.close(); db.close(); int messagecount = -1; //START MAIN LOOP TO CHECK NEW MESSAGES /* * Counts starts at -1 then gets count then if 1 is * added to newcount newcount is > than last message count * notify uesers. */ for(;;){ try{ String result = ""; //Shownotify();//WILL LOOP ALL THE TIME: LOOP TEST HttpClient client = new DefaultHttpClient(); HttpPost request = new HttpPost("http:GetInfo.php"); List<NameValuePair> postParameters = new ArrayList<NameValuePair>(); postParameters.add(new BasicNameValuePair("UserName", Username)); UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(postParameters); request.setEntity(formEntity); HttpResponse response = client.execute(request); HttpEntity entity = response.getEntity(); InputStream is = entity.getContent(); BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8); StringBuilder sb = new StringBuilder(); String line = null; while((line = reader.readLine())!= null){ sb.append(line + "\n"); } is.close(); result = sb.toString(); JSONArray jArray = new JSONArray(result); int newcount = 0; for(int i=0;i<jArray.length(); i++){ JSONObject json_data = jArray.getJSONObject(i); newcount = json_data.getInt("counter"); } if(MyGlobalInformation.getStopLoop() == true){ break; } if(newcount > messagecount && messagecount != -1){ messagecount = newcount; Shownotify(); } else{ messagecount = newcount; } } catch(Exception e){ HomeScreen.setStartedState(false); } } return null; } @Override protected void onPostExecute(Object o) { HomeScreen.setStartedState(false); } }; asyncTask.execute(); } catch(Exception e){ HomeScreen.setStartedState(false); } return START_STICKY; }
原文:https://stackoverflow.com/questions/5194519
更新时间:2023-11-25 22:11
最满意答案
您可以使用以下代码段为SharedPreference注册ChangListener:
SharedPreferences.OnSharedPreferenceChangeListener prefListener = new SharedPreferences.OnSharedPreferenceChangeListener() { public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { .... } }; rates_storage.registerOnSharedPreferenceChangeListener(prefListener);
You can use following code snippet to register your ChangListener for the SharedPreference:
SharedPreferences.OnSharedPreferenceChangeListener prefListener = new SharedPreferences.OnSharedPreferenceChangeListener() { public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { .... } }; rates_storage.registerOnSharedPreferenceChangeListener(prefListener);
相关问答
更多-
您可以让您的首选项活动通过使用startActivityForResult(Intent, int)而不是仅在主活动中使用startActivity(Intent)将包含颜色信息的Intent传递回主活动。 然后可以在onActivityResult(int, int, Intent)期间读取intent数据,在首选项活动完成时自动调用。 代码如下所示: public class MainActivity extends Activity { // ... public static f ...
-
不确定你的问题是什么,想要什么。 但是你需要做一个改变。 在onResume中替换它 sPrefs = getPreferences(MODE_PRIVATE); prefsChangedListener = new PreferenceChangedListener(); sPrefs.registerOnSharedPreferenceChangeListener(prefsChangedListener ); 至 sPrefs = PreferenceManager.getDefaultShare ...
-
onsharedpreferencechangelistener不适用于android应用程序(onsharedpreferencechangelistener not work in android app)[2022-02-04]
MODE_WORLD_READABLE已弃用,请尝试MODE_PRIVATE I solved my problem: public class MainActivity extends Activity { SharedPreferences pref; SharedPreferences.OnSharedPreferenceChangeListener listener = new SharedPreferences.OnSharedPreferenceChang ... -
OnSharedPreferenceChangeListener没有被解雇(OnSharedPreferenceChangeListener not getting fired)[2022-04-17]
在onCreate你注册你的听众 prefs.registerOnSharedPreferenceChangeListener(listener); 你可以在onDistry上取消注册 如果你这样做,这应该工作! listener = new SharedPreferences.OnSharedPreferenceChangeListener() { public void onSharedPreferenceChanged(SharedPreferences prefs, String ke ... -
SharedPreferences不支持多个进程。 因此,不会调用App B中的OnSharedPreferencesChangedListener。 链接: http : //developer.android.com/reference/android/content/SharedPreferences.html 注意:目前此类不支持跨多个进程使用。 这将在稍后添加。 SharedPreferences does not support multiple processes. So OnSharedPr ...
-
SharedPreferences的范围(Scope of SharedPreferences)[2022-08-26]
SharedPreferences类提供了一个通用框架,允许您保存和检索原始数据类型的持久键值对。 您可以使用SharedPreferences来保存任何原始数据:布尔值,浮点数,整数,长整数和字符串。 这些数据将在用户会话中持续存在(即使您的应用程序被终止)。 您可以使用SharedPreferences 。 如果您对SharedPreferences的生活感到好奇,那么它清楚地知道它将在您的应用程序的整个生命周期中可用。 但请记住,当用户清除应用程序数据时,所有应用程序存储都会丢失数据,因此Shared ... -
Xamarin android OnSharedPreferenceChangeListener(Xamarin android OnSharedPreferenceChangeListener)[2023-02-17]
我找到了解决方案! 改变 PreferenceScreen.SharedPreferences. RegisterOnSharedPreferenceChangeListener(this); 至 PreferenceManager.GetDefaultSharedPreferences(this). RegisterOnSharedPreferenceChangeListener(this); 会做的伎俩。 我希望它会对某人有所帮助。 Ive found solution! changing Pref ... -
你永远不会写你的喜好。 你需要一个prefs.putInt("mode", some_int); 某处。 你的听众也没有任何目的 - 放弃它。 您正在写入默认共享首选项,因为首选项屏幕在那里写入。 “模式”只是关键 - 默认共享首选项中有一个键,而您的首选项文件中有一个键(名为“mode_something.xml”) - 但是您可以编写一个键(通过首选项屏幕自动)并阅读另一个(从未设定) You never write to your preferences. You need a prefs.putIn ...
-
是的,如下所示,可以同时拥有多个侦听器: https://android.googlesource.com/platform/frameworks/base.git/+/master/core/java/android/app/SharedPreferencesImpl.java#186 你的问题可能在其他地方。 Yes, it is possible to have multiple listeners at once as seen here: https://android.googlesource. ...
-
SharedPreferences - OnSharedPreferenceChangeListener(SharedPreferences - OnSharedPreferenceChangeListener)[2022-04-19]
您可以使用以下代码段为SharedPreference注册ChangListener: SharedPreferences.OnSharedPreferenceChangeListener prefListener = new SharedPreferences.OnSharedPreferenceChangeListener() { public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, ...