服务正在启动,但OnCreate或OnStart方法没有被调用。
服务正在启动,但OnCreate或OnStart方法没有被调用。
我目前正在进行一个安卓项目,我试图启动一个服务,当服务开始运行时初始化一些东西。\n下面是我用于服务的代码。\n
Context context; PowerManager.WakeLock wakeLock; public PowerDetectionService(Context context) { this.context = context; } public PowerDetectionService() {} public void onCreate() { super.onCreate(); PowerManager pm = (PowerManager)getApplication().getApplicationContext().getSystemService(Context.POWER_SERVICE); wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "ScreenStay"); } public void onStart(Intent intent, int startId) { super.onStart(intent, startId); PowerManager pm = (PowerManager)getApplication().getApplicationContext().getSystemService(Context.POWER_SERVICE); wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "ScreenStay"); } @Override public IBinder onBind(Intent intent) { return null; } public void receivedPowerConnected() { try { Toast.makeText(context, "已连接电源", Toast.LENGTH_LONG).show(); wakeLock.acquire(); } catch (Exception ex) { Toast.makeText(context, ex.toString(), Toast.LENGTH_LONG).show(); } } public void receivedPowerDisconnected() { try { Toast.makeText(context, "已断开电源", Toast.LENGTH_LONG).show(); wakeLock.release(); } catch (Exception ex) { Toast.makeText(context, ex.toString(), Toast.LENGTH_LONG).show(); } }
\n唤醒锁(wake lock)始终为null,因为在oncreate或onstart中的代码段从未执行。我尝试将它放在绑定函数中,但仍然没有成功。\n当我进入安卓设置时,我可以看到我的应用程序正在运行服务,但我需要在任何操作之前初始化该代码。\n感谢您提供的任何帮助。\n更新\n我发现这些函数正在被调用,感谢之前的评论。由于某种原因,调试器不会被触发。\n下面是根据请求显示如何创建服务器的代码。\n
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); startService(this); } public void onResume() { super.onResume(); startService(this); } private void startService(Context context) { Intent service = new Intent(context, PowerDetectionService.class); context.startService(service); }
\n更新2\n根据下面的请求,这是启动服务并执行唤醒锁的所有代码。\n下面是启动服务的主要活动\n
public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); StartPowerService(this); //getActionBar().setDisplayHomeAsUpEnabled(true); } public void onResume() { super.onResume(); StartPowerService(this); } private void StartPowerService(Context context) { Intent service = new Intent(context, PowerDetectionService.class); startService(service); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { //case android.R.id.home: // NavUtils.navigateUpFromSameTask(this); // return true; } return super.onOptionsItemSelected(item); } }
\n下面是服务的类\n
public class PowerDetectionService extends Service { Context context; PowerManager.WakeLock wakeLock; public PowerDetectionService(Context context) { this.context = context; } public PowerDetectionService() {} public void onCreate() { super.onCreate(); Log.d("SERVICE", "ON CREATE CALLED"); PowerManager pm = (PowerManager)getApplication().getApplicationContext().getSystemService(Context.POWER_SERVICE); wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "ScreenStay"); } public int OnStartCommand(Intent intent, int flags, int startId) { Log.d("SERVICE", "ONSTARTCOMMAND Called"); PowerManager pm = (PowerManager)getApplication().getApplicationContext().getSystemService(Context.POWER_SERVICE); wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "ScreenStay"); return START_STICKY; } public void onStart(Intent intent, int startId) { super.onStart(intent, startId); Log.d("SERVICE", "ON START CALLED"); PowerManager pm = (PowerManager)getApplication().getApplicationContext().getSystemService(Context.POWER_SERVICE); wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "ScreenStay"); } @Override public IBinder onBind(Intent intent) { return null; } public void receivedPowerConnected() { try { Toast.makeText(context, "已连接电源", Toast.LENGTH_LONG).show(); wakeLock.acquire(); } catch (Exception ex) { Toast.makeText(context, ex.toString(), Toast.LENGTH_LONG).show(); } } public void receivedPowerDisconnected() { try { Toast.makeText(context, "已断开电源", Toast.LENGTH_LONG).show(); wakeLock.release(); } catch (Exception ex) { Toast.makeText(context, ex.toString(), Toast.LENGTH_LONG).show(); } } }
\n以下是清单文件。\n
\n希望这有所帮助。
问题的原因是因为在启动服务时,虽然服务正在启动,但并没有调用OnCreate或OnStart方法。这可能是因为onStart方法已被弃用,应该使用onStartCommand方法来替代。而onCreate方法应该在服务运行时被调用,但只会被调用一次。
解决方法是替换onStart方法为onStartCommand方法,并确保在启动服务时使用Context.startService方法。
以下是修正后的代码示例:
public class MyService extends Service { @Override public int onStartCommand(Intent intent, int flags, int startId) { // 在这里处理服务的逻辑 return START_STICKY; } @Override public void onCreate() { super.onCreate(); // 在这里进行服务的初始化操作 } }
通过使用onStartCommand方法来处理服务的逻辑,并在onCreate方法中进行服务的初始化操作,就可以解决服务启动时OnCreate或OnStart方法未被调用的问题。
问题出现的原因是使用了错误的方法来启动Service,并且在代码中创建了一个新的实例来使用wakelock,导致wakelock为null。解决方法是使用正确的方法来启动Service,并将wakelock设置为static。
在旧的Android版本(<2.0),应使用onStart()方法,而不是onStartCommand()方法。在较新的版本中,应使用以下方法:
public int onStartCommand(Intent intent, int flags, int startId)
在方法中,如果希望服务在执行代码后继续运行,则需要返回START_STICKY。如果服务未保持活动状态,则PowerManager.FULL_WAKE_LOCK将被释放。可能还可以将wakelock设置为static。
要启动Service,请使用以下代码:
Intent i = new Intent(this, PowerDetectionService.class); startService(i);
根据这里的主题:getApplication() vs. getApplicationContext(),当使用getApplicationContext()获取上下文时,可能会得到不同的Context对象。尝试更改以下行:
PowerManager pm = (PowerManager)getApplication().getApplicationContext().getSystemService(Context.POWER_SERVICE);
改为:
PowerManager pm = (PowerManager)this.getSystemService(Context.POWER_SERVICE);
如果按照上述步骤操作仍然无法解决问题,请贴出启动Service的代码、AndroidManifest和完整的Service代码。
最后,注意在AndroidManifest.xml中添加android.permission.WAKE_LOCK
权限,并删除可能导致问题的android:process=":ScreenStay"
。
(Service is being started but OnCreate or OnStart are not being called)这个问题的出现的原因是因为你在不同的进程中启动了服务。当新的进程启动时,它没有调试器附加,所以它会忽略你的断点。如果你想要调试远程进程,你可以在Eclipse的DDMS视图中进行。在设备下面,你可以看到它的进程。然后你可以选择一个进程,按下调试选定的进程(绿色的bug图标)。这在你只想从某个点开始调试你的应用程序时也很有用。
至于调试onCreate()方法,你必须在进程启动后但在onCreate()方法被调用之前附加调试器。你可以在onCreate()方法的开头放一些Thread.sleep(),让它睡几秒钟,这样你就可以附加调试器。