gpt4 book ai didi

android - 服务不从 BroadcastReceiver 运行? - 安卓

转载 作者:行者123 更新时间:2023-11-30 04:07:07 26 4
gpt4 key购买 nike

我正在尝试在我的电话有拨出电话时运行我的服务。但是由于某种原因,发生这种情况时我的服务不会运行。我知道“CallReceiver”的代码会执行,因为如果它运行,我会使用 toast 消息来显示。我可以通过我的主要 Activity 来运行该服务,但这意味着无论是否进行传出调用,它都会运行....

下面是我的代码:

接收方:

package com.example.hiworld;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.Toast;

public class CallReceiver extends BroadcastReceiver{

@Override
public void onReceive(Context context, Intent intent) {
context.startService(new Intent(context, CallService.class));

Toast.makeText(context, "Call Receiver started",
Toast.LENGTH_LONG).show();

Log.d("Calling Someone", "onReceived");

}


}

服务:

package com.example.hiworld;


import android.app.IntentService;
import android.content.Context;
import android.content.Intent;
import android.telephony.TelephonyManager;
import android.widget.Toast;

public class CallService extends IntentService {

public long StartTime=0;
public long EndTime =0;
public long TotalTime = 0;
public long NumFreeMins = 0;


public CallService() {
super("CallService");
}

@Override
protected void onHandleIntent(Intent intent) {


StartTime = (System.currentTimeMillis())/60;

TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);




if(tm.getCallState()==0) //getting the time whenever the phone is off
{

EndTime = (System.currentTimeMillis())/60;
TotalTime = EndTime-StartTime;
NumFreeMins = 300-TotalTime;

//notify user
this.displaymsg();

}



}

public void displaymsg()
{
Toast toast = Toast.makeText(getApplicationContext(), ""+NumFreeMins, Toast.LENGTH_SHORT);
toast.show();
}
}

我见过一些人使用这条线:

context.startService(new Intent(this, CallService.class));

代替:

context.startService(new Intent(context, CallService.class));

但后者对我不起作用......

最佳答案

尝试指定 <intent-filter>为你的 IntentService在特定“操作”的 list 中。示例...

<service
android:name=".CallService" >
<intent-filter>
<action android:name="com.example.hiworld.intent.DO_SOMETHING" />
</intent-filter>
</service>

然后在onReceive(...)你的方法 BroadcastReceiver做类似下面的事情......

Intent callReceiverIntent = new Intent("com.example.hiworld.intent.DO_SOMETHING");

// Put the Intent received by the BroadcastReceiver as extras so the
// IntentService can process it...
callReceiverIntent.putExtras(intent);

context.startService(callReceiverIntent);

编辑:

我根据您发布到 pasrebin 的代码构建了一个简单的测试应用程序。我保持 list 、接收器和服务的代码相同,只需添加一个默认值 Activity。为了让它运行。

我从eclipse的DDMS视角监控logcat可以看到CallReceiver成功收到NEW_OUTGOING_CALL Intent事实上,确实启动了 CallService .

但是,问题在于尝试显示 Toast来自 IntentService由于“泄漏的处理程序”而导致异常并无声地崩溃。

这背后的原因是 IntentService使用后台线程执行其工作并尝试显示 Toast来自非 UI 线程的(即 UI 元素)将不起作用,因为应用程序没有运行 UI 组件。所以,不管你是否使用本地context变量或 getApplicationContext() , 根本没有与 Toast 关联的 UI 上下文.

它在启动 CallService 时起作用的原因来自 Activity显然是因为 Activity提供一个 UI 上下文,可以被 Toast 使用.简而言之,通常似乎试图使用 Toast来自 IntentService这不是一个好主意,除非 IntentService 总是由 UI 组件启动,即使这样,让后台线程创建 UI 元素(例如 Toast)也可能会导致问题。

可以使它与当前模型一起工作的唯一方法是更改​​ IntentServiceService .默认情况下,代码执行 Service在主 (UI) 线程上完成并且对于 Service 是完全合法的显示Toast不管是否有任何应用程序的Activities显示与否。事实上,我修改了代码以使用 Service并放置来自 onHandleIntent 的代码在onStartCommand()我可以看到 Toasts拨出电话时。

关于android - 服务不从 BroadcastReceiver 运行? - 安卓,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11423000/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com