我有一個應用程序,其中有許多活動,並且在應用程序「後面」我希望服務器套接字始終運行,應請求監聽和提供數據。啓動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