我有一个应用程序,其中有许多活动,并且在应用程序“后面”我希望服务器套接字始终运行,应请求监听和提供数据。启动Android服务时强制关闭(作为服务器套接字)
所以我创建了一个服务,但也许我不理解它是如何工作的,因为我有一些问题。让我们来看看我的服务:
public class MyService extends Service {
private static final String TAG = "MyService";
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onCreate() {
Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG).show();
Log.d("STATUS", "onCreate service");
try {
// create socket
ServerSocket servsock;
servsock = new ServerSocket(50000);
Log.v("STATUS","SERVER SOCKET CREATED at="+50000);
while (true) {
Log.v("status","Waiting...");
Socket sc = servsock.accept();
Log.v("status","Accepted connection : " + sc);
ObjectOutputStream os = new ObjectOutputStream(sc.getOutputStream());
ObjectInputStream is = new ObjectInputStream(sc.getInputStream());
.........
sc.close();
}
.............
在我的应用程序显示这是一个登录界面,我想该服务登录后imediatelly启动(上创作的“登录”活动)
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.mainActivity);
startService(new Intent(this, MyService.class));
........
第一屏
问题是,当活动开始时,我得到一个黑色屏幕上方的强制关闭(有趣,因为startService在setContentView之后) - 尽管我可以通过Logcat看到服务(和服务器套接字)已执行。
活动管理给我提供以下信息:
01-10 17:55:43.706:E/ActivityManager(2490):ANR在 com.sapo.android.obesidade 01-10 17: E/ActivityManager(2490):Load:1.24/1.13/1.14/1.13/E/ActivityManager(2490):CPU使用率从43658ms到10ms前:01-10 17:55:43.706:E/ActivityManager(2490):system_server:6%= 3%用户+ 3%ke rnel/faults:7590 minor 01-10 17:55:43.706: E/ActivityManager(2490):.app.twlauncher:2%= 2%user + 0%kernel/ fault:812 minor 01-10 17:55 :43.706:E/ActivityManager(2490):
mmcqd:0%= 0%用户+ 0%内核
所以问题无疑是(它的工作原理,如果去掉)上,而(真) - 这是已经在Activity中的AsyncTask中工作(不使用服务)。
我该怎么办?
坚持一秒,所以你运行这项服务作为异步任务? (在不同的线程?) – ScarletAmaranth 2012-01-10 18:40:34
@ScarletAmaranth,不,我在使用服务之前运行(暂时)在AsyncTask上的服务器套接字!该解决方案的明显问题是我无法在后台运行服务器。 – Tiago 2012-01-10 19:45:58