Android 调试同步解析对象的IntentService

Android 调试同步解析对象的IntentService,android,android-intent,intentservice,android-debug,Android,Android Intent,Intentservice,Android Debug,我有一个android项目,它的后端使用parse.com。为了减少api调用的数量,我一直将“不太重要”的数据固定到本地数据存储,并尝试在每个用户会话中同步一次。我正在为此使用IntentService。我正在呼叫IntentService,如下所示。但是我没有看到在调用IntentService时调用任何日志消息或调试断点 问题1:如何调试任何Intent服务 问题2:我希望每个用户会话执行一次服务(每次用户打开和关闭应用程序时)。我不想将代码添加到活动的onPause方法中,因为我的应用程

我有一个android项目,它的后端使用parse.com。为了减少api调用的数量,我一直将“不太重要”的数据固定到本地数据存储,并尝试在每个用户会话中同步一次。我正在为此使用IntentService。我正在呼叫IntentService,如下所示。但是我没有看到在调用IntentService时调用任何日志消息或调试断点


问题1:如何调试任何Intent服务

问题2:我希望每个用户会话执行一次服务(每次用户打开和关闭应用程序时)。我不想将代码添加到活动的onPause方法中,因为我的应用程序有多个活动,因此onPause在会话中会被多次调用。因此,我正在从活动的onBackPressed调用服务,这是用户可以退出应用程序之前的最后一个屏幕。这是万无一失的吗

意图调用代码:

@Override
public void onBackPressed() {
    if(exitCount == 1)
    {
        exitCount=0;

        Intent i= new Intent(this, SyncChoiceService.class);
        this.startService(i);
        super.onBackPressed();
    }
    else
    {
        Toast.makeText(getApplicationContext(), "Press Back again to quit.", Toast.LENGTH_SHORT).show();
        exitCount++;
    }

    return;
}
IntentService代码

    public class SyncChoiceService extends IntentService {

    /**
     * Creates an IntentService.  Invoked by your subclass's constructor.
     *
     * @param name Used to name the worker thread, important only for debugging.
     */
    public SyncChoiceService(String name) {
        super("SyncChoiceService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        //android.os.Debug.waitForDebugger();
// Adding this waitForDebugger doesn't make a difference
        ParseQuery query = new ParseQuery("PostChoice");
        query.fromPin();
        query.findInBackground(new FindCallback<ParseObject>() {
            @Override
            public void done(final List<ParseObject> list, ParseException e) {
                    if(list!=null)
                    {
                        if(!list.isEmpty())
                        {
                            ParseObject.saveAllInBackground(list, new SaveCallback() {
                                @Override
                                public void done(ParseException e) {
                                    ParseObject.unpinAllInBackground(list, new DeleteCallback() {
                                        @Override
                                        public void done(ParseException e) {
                                            Log.i("Unpinned ","everything");
                                        }
                                    });
                                }
                            });
                        }
                    }
            }
        });

    }
}
公共类SyncChoiceService扩展了IntentService{
/**
*创建一个IntentService。由子类的构造函数调用。
*
*@param name用于命名工作线程,仅对调试很重要。
*/
公共SyncChoiceService(字符串名称){
超级(“同步选择服务”);
}
@凌驾
受保护的手部内容无效(意图){
//android.os.Debug.waitForDebugger();
//添加这个waitForDebugger没有什么区别
ParseQuery查询=新的ParseQuery(“后选择”);
query.fromPin();
findInBackground(新的FindCallback(){
@凌驾
公共作废完成(最终列表,Parsee){
如果(列表!=null)
{
如果(!list.isEmpty())
{
saveAllInBackground(列表,新的SaveCallback(){
@凌驾
公共作废完成(Parsee异常){
ParseObject.UnpinalInBackground(列表,新的DeleteCallback(){
@凌驾
公共作废完成(Parsee异常){
Log.i(“未固定”,“一切”);
}
});
}
});
}
}
}
});
}
}

问题1:如何调试任何Intent服务? 如注释中所述,您应该能够设置断点并将调试器附加到服务

问题2:我想执行服务。。。? 这将取决于您的需求以及您希望如何定义会话

如果会话定义为用户登录/注销时,那么您只需在登录/注销逻辑中输入简单启动代码即可

如果将会话定义为当应用程序处于前台/直到它进入后台/被杀死,则会变得更加复杂。我将尽力提供尽可能多的信息/案例:

启动应用程序是最简单的部分,因此,您只需在启动程序活动的
onCreate
中启动服务,甚至
application
onCreate
中启动服务(如果您对其进行子分类)

关闭应用程序取决于您定义为关闭的内容。如果您要求用户明确退出应用程序,则无需考虑以下情况:

用户只需按下home(主页)按钮即可将应用程序置于后台,在这种情况下,将不会调用
onBackPressed
,系统可能会在后台清理您的应用程序,因此您将永远没有机会启动服务。在这种情况下,系统将调用
onSaveInstanceState
,给您一个启动服务的机会。(如果你不在乎这个案子,那你就没事了)。这里的一个边缘情况是,
onSavedInstance
状态也被称为屏幕旋转,因此您需要一些逻辑来区分应用程序何时进入后台和屏幕旋转

另一方面:
onHandleIntent
在后台线程上被调用,因此您可以使用同步版本的
find
save
unpin
这将帮助您避免所有嵌套


希望这会有所帮助。

OnHandleContent
的开头添加一些
Log.d
您确定本地数据存储中有东西吗?您的列表可能是空的,并且该语句从未被记录。你可以尝试在你的解析调用之外记录一些东西。我在OnHandleContent的请求中添加了Log.d,它也没有被打印出来。对不起,我刚刚看到你已经添加了WaitForDeBugger。你的服务正常启动了吗?尝试在实际启动服务时记录一些内容,然后查看是否调用过onHandleIntent。另外,这只是一个旁注,您确实在清单中声明了您的服务,对吗?