2011-05-15 55 views
4

我尝试在android上为phonestate编写XML日志。首先,我写了一个单独的类来记录活动活动期间的内容。现在我试图在服务中写入xml文件并将服务绑定到活动。后来我想在后台登录状态,所以我至少需要一个服务和一个广播接收者。但是我在绑定时失败,无法在onServiceConnected()方法中获得服务对象。该方法从未被调用。我试图等待服务的异步启动,就像我在另一篇文章中读到的一样,但它不起作用。 我使用eclipse和普通的调试器工作。无法获取服务对象(onServiceConnected从未调用过)

public class MyActivity extends Activity { 
//The layout of the application. 
private TableLayout t; 
//The service, which is writing the xml-file. 
private FileService fservice; 
private boolean mIsBound; 
private final Handler handler = new Handler(); 

private ServiceConnection mConnection = new ServiceConnection() { 
    public void onServiceConnected(ComponentName className, IBinder service) { 
     // This is called when the connection with the service has been 
     // established, giving us the service object we can use to 
     // interact with the service. Because we have bound to a explicit 
     // service that we know is running in our own process, we can 
     // cast its IBinder to a concrete class and directly access it. 
     fservice = ((FileService.LocalBinder)service).getService(); 

    } 

    public void onServiceDisconnected(ComponentName className) { 
     // This is called when the connection with the service has been 
     // unexpectedly disconnected -- that is, its process crashed. 
     // Because it is running in our same process, we should never 
     // see this happen. 
     fservice = null; 
    } 
}; 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.table_layout); 

    doBindService(); 

    //Initialization of the TableLayout. 
    t = (TableLayout) findViewById(R.id.myTableLayout); 
} 

@Override 
public void onStart(){ 
    super.onStart(); 

    //Initialization of the TelephonyManager. 
    final TelephonyManager myTelephonyMgr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); 

    Runnable r = new Runnable() 
    { 
      public void run() 
      { 
       //Gets the IMSI and IMEI. 
       String imsi = myTelephonyMgr.getSubscriberId(); 
       createRow(getTimeStamp(), "IMSI: "+imsi); 
       createLine(); 
       String imei = myTelephonyMgr.getDeviceId(); 
       createRow(getTimeStamp(), "IMEI: "+imei); 
       createLine(); 

       //Gets the cell informations. 
       GsmCellLocation cell = (GsmCellLocation) myTelephonyMgr.getCellLocation(); 
       createRow(getTimeStamp(),"CID: "+cell.getCid()); 
       createLine(); 
       createRow(getTimeStamp(), "LAC: "+cell.getLac()); 
       createLine(); 

       //Gets the call states. 
       myTelephonyMgr.listen(new MyPhoneStateListener(MyActivity.this), PhoneStateListener.LISTEN_CALL_STATE); 
      } 
    }; 

    handler.postDelayed(r, 4000); 


} 

/** 
* Creates a new TableRow. 
* 
* @param stampText 
* @param actionText 
*/ 
protected void createRow(String stampText, String actionText){ 
    ... 
    fservice.createRow(stampText, actionText); 
} 

... 


private void doBindService() { 
    // Establish a connection with the service. We use an explicit 
    // class name because we want a specific service implementation that 
    // we know will be running in our own process (and thus won't be 
    // supporting component replacement by other applications). 
    bindService(new Intent(MyActivity.this, FileService.class), mConnection, Context.BIND_AUTO_CREATE); 
    mIsBound = true; 
} 

private void doUnbindService() { 
    if (mIsBound) { 
     // Detach our existing connection. 
     unbindService(mConnection); 
     mIsBound = false; 
    } 
} 


@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    doUnbindService(); 
} 

}

公共类的FileService延伸服务{ ... //这是接收来自客户端交互的对象。 private final IBinder mBinder = new LocalBinder();

/** 
* Class for clients to access. Because we know this service always 
* runs in the same process as its clients, we don't need to deal with 
* IPC. 
*/ 
public class LocalBinder extends Binder { 
    FileService getService() { 
     return FileService.this; 
    } 
} 

@Override 
public IBinder onBind(Intent intent) { 
    return mBinder; 

} 
... 

}

+0

为此得到了解决方案? – 2013-02-18 12:31:24

回答

4

你加服务定义为AndroidManifest.xml文件?像这样:

<manifest ... > 
    ... 
    <application ... > 
     <service android:name=".ExampleService" /> 
     ... 
    </application> 
</manifest>