2013-05-04 72 views
0

我沒有太多的Android開發經驗。現在,我無法從服務的onStartCommand方法註冊接收者。Android - 無法註冊服務的廣播

在英語中它會是:我有兩個按鈕(開始/停止服務)上的活動。當我點擊開始按鈕時,我不想運行將註冊BroadcastReceiver(SMS_RECEIVED)的服務。收到短信時,我不會看到日誌跟蹤。但我看不到它!

看來我不能註冊我的廣播接收器,但我知道我的服務正在運行(感謝日誌)。另外,我想讓我的服務,因此我的BroadcastReceiver,持久性(如果我退出應用程序,我希望它在後臺運行,即使我重新啓動手機)。

誰能告訴我我的代碼有什麼問題嗎? ...也許給我幫助我的第二個問題.... :)

謝謝!

這裏是我的代碼:

---活動:主要---

package com.tuto.servicerunbroadcastreceiver; 

import XYZ 

public class Main extends Activity implements OnClickListener 
{ 
Button bt_start; 
Button bt_stop; 

@Override 
protected void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    bt_start = (Button)findViewById(R.id.button1); 
    bt_start.setOnClickListener(this); 
    bt_stop = (Button)findViewById(R.id.button2); 
    bt_stop.setOnClickListener(this); 
} 

@Override 
public void onClick(View v) 
{ 
    switch (v.getId()) 
    { 
    case R.id.button1 : 
    { 
    Log.d("Button : ", "Button start"); 
    startService(new Intent(this, svcMessage.class));  
    break ; 
    } 
    case R.id.button2 : 
    { 
    Log.d("Button : ", "Button stop"); 
    stopService(new Intent(this, svcMessage.class)); 
    break ; 
    } 
    } 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) 
{ 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 
} 

---服務:svcMessage ---

package com.tuto.servicerunbroadcastreceiver; 

import XYZ; 

public class svcMessage extends Service 
{ 
private static final String ACTION_RECEIVE_SMS = "android.provider.Telephony.SMS_RECEIVED"; 
private BroadcastReceiver br_receiver; 

@Override 
public IBinder onBind(Intent arg0) 
{ 
    return null; 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) 
{ 
    final IntentFilter filter = new IntentFilter(); 
    filter.addAction("ACTION_RECEIVE_SMS"); 
    Log.d("Service : ", "start"); 
    this.br_receiver = new BroadcastReceiver() 
    { 
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
    Log.d("LOG : ", "onReceive"); 
    } 
    }; 
    this.registerReceiver(this.br_receiver, filter); 
    return (START_STICKY); 
} 

@Override 
public void onDestroy() 
{ 
    super.onDestroy(); 
    Log.d("Service : ", "destroy"); 
    this.unregisterReceiver(this.br_receiver); 
} 
} 

---清單。 xml ---

<manifest 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.tuto.servicerunbroadcastreceiver" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk 
     android:minSdkVersion="8" 
     android:targetSdkVersion="17" /> 

    <application 
     android:allowBackup="true" 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" 
     android:theme="@style/AppTheme" > 
     <activity 
      android:name="com.tuto.servicerunbroadcastreceiver.Main" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <service android:name="com.tuto.servicerunbroadcastreceiver.svcMessage"> 
     </service> 
    </application> 
</manifest> 

回答

0

看來你有一個簡單的錯誤在這裏:

//without "" 
filter.addAction(ACTION_RECEIVE_SMS); 

,不要忘記添加的權限:

<uses-permission android:name="android.permission.RECEIVE_SMS" /> 

還有一件事,如果你註銷在onDestory()接收器。你應該在onCreate()服務上註冊。

+0

謝謝!我剛剛測試過,效果很好。我花了很多時間在上面!對於權限,它不會顯示我發佈的代碼,但我不知道爲什麼。這件作品已經在清單文件中。順便說一句,感謝您對onCreate方法的建議。 :) – frontal 2013-05-04 01:37:33