服务正在启动,但OnCreate或OnStart方法没有被调用。

11 浏览
0 Comments

服务正在启动,但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 \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n\n希望这有所帮助。

0
0 Comments

问题的原因是因为在启动服务时,虽然服务正在启动,但并没有调用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方法未被调用的问题。

0
0 Comments

问题出现的原因是使用了错误的方法来启动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"

0
0 Comments

(Service is being started but OnCreate or OnStart are not being called)这个问题的出现的原因是因为你在不同的进程中启动了服务。当新的进程启动时,它没有调试器附加,所以它会忽略你的断点。如果你想要调试远程进程,你可以在Eclipse的DDMS视图中进行。在设备下面,你可以看到它的进程。然后你可以选择一个进程,按下调试选定的进程(绿色的bug图标)。这在你只想从某个点开始调试你的应用程序时也很有用。

至于调试onCreate()方法,你必须在进程启动后但在onCreate()方法被调用之前附加调试器。你可以在onCreate()方法的开头放一些Thread.sleep(),让它睡几秒钟,这样你就可以附加调试器。

0