我试图从服务开始活动,但应用程序强制关闭。我正在从广播接收器开始服务

时间:2012-08-28 06:36:42

标签: android service broadcastreceiver android-activity

广播接收器的代码是

public class MyBroadcastreceiver extends BroadcastReceiver {

public void onReceive(Context context, Intent intent) {
    Intent startServiceIntent = new Intent(context, MyService.class);
    startServiceIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startService(startServiceIntent);

   }
 }

服务的代码是

public class MyService extends Service {

 String tag="TestService";
 @Override
  public void onCreate() {

     Toast.makeText(this, "Service created...", Toast.LENGTH_LONG).show();      
  // Log.i(tag, "Service created...");
    }

   @Override
   public void onStart(Intent intent, int startId) {      
   super.onStart(intent, startId);  
   Intent dialogIntent = new Intent(getBaseContext(), LocationStat.class);
   dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
   getApplication().startActivity(dialogIntent);
   }

  @Override
  public int onStartCommand(Intent intent, int flags, int startId) {

   Toast.makeText(this,"task perform in service",Toast.LENGTH_LONG).show();
  /* startActivity(new Intent(MyService.this,LocationStat.class));*/
     return super.onStartCommand(intent, flags, startId);
   }
   @Override
   public void onDestroy() {
   super.onDestroy();
   Toast.makeText(this, "Service destroyed...", Toast.LENGTH_LONG).show();
   }

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

我尝试从服务启动的活动是

public class LocationStat extends Activity {
double logi;
double lat;
long MINIMUM_DISTANCE_CHANGE_FOR_UPDATES = 1; // in Meters
long MINIMUM_TIME_BETWEEN_UPDATES = 1000; // in Millisecon
Location loc;
LocationManager manager;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    manager=(LocationManager)getSystemService(Context.LOCATION_SERVICE);
    manager.requestLocationUpdates(
            LocationManager.GPS_PROVIDER, 
            MINIMUM_TIME_BETWEEN_UPDATES, 
            MINIMUM_DISTANCE_CHANGE_FOR_UPDATES,
            new MyLocationListener()
    );
   Toast.makeText(this,"activity created...",Toast.LENGTH_LONG).show();
   loc=manager.getLastKnownLocation(LocationManager.GPS_PROVIDER);

   String s;
   if(loc!=null)
   {
     logi=loc.getLongitude();
     lat=loc.getLatitude();
      s="Lat:" + lat + "\nLong:" + logi;

   }
   else
   {
    s ="no location found";
   }

   Toast.makeText(LocationStat.this,"Your Current Position is:\n" +
           s,Toast.LENGTH_LONG).show();
   webcall(logi,lat);
   //getLoc();

}
public void webcall(double logi,double lat)
    {
        InputStream is=null;
        String result = "";
        //the year data to send
        ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
        nameValuePairs.add(new BasicNameValuePair("logitude",Double.toString(logi)));
        nameValuePairs.add(new BasicNameValuePair("latitude",Double.toString(lat)));

        //http post
        try{
                HttpClient httpclient = new DefaultHttpClient();
                HttpPost httppost = new HttpPost("http://10.0.2.2/location.php");
                httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                HttpResponse response = httpclient.execute(httppost);
                HttpEntity entity = response.getEntity();
                is = entity.getContent();
        }catch(Exception e){
                Toast.makeText(LocationStat.this,"Error in http connection "+e.toString(),Toast.LENGTH_LONG).show();
        }
        //convert response to string
        try{
                BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
                StringBuilder sb = new StringBuilder();
                String line = null;
                while ((line = reader.readLine()) != null) {
                        sb.append(line + "\n");
                }
                is.close();

                 result=sb.toString();




                Toast.makeText(LocationStat.this,result,Toast.LENGTH_LONG).show();
        }catch(Exception e){
                Toast.makeText(LocationStat.this,"Error converting result       "+e.toString(),Toast.LENGTH_LONG).show();
        }

清单看起来像这样

<service android:enabled="true" android:name=".MyService">
            <intent-filter >
                <action android:name="com.android.trace.MyService"/>

            </intent-filter>
        </service>

        <receiver android:name="com.android.trace.MyBroadcastReceiver">  
            <intent-filter>  
              <action android:name="android.intent.action.BOOT_COMPLETED" />  
             </intent-filter>  
        </receiver> 


    <activity
        android:name=".LocationStat"
        android:label="@string/title_activity_location_stat" >
        <intent-filter>
             <action android:name="android.intent.action.MAIN" />  

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

</application>
 <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
  <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> 

logcat

08-28 06:47:07.388: E/AndroidRuntime(265): FATAL EXCEPTION: main
08-28 06:47:07.388: E/AndroidRuntime(265): java.lang.RuntimeException: Unable to instantiate receiver com.android.trace.MyBroadcastReceiver: java.lang.ClassNotFoundException: com.android.trace.MyBroadcastReceiver in loader dalvik.system.PathClassLoader[/data/app/com.android.trace-1.apk]
08-28 06:47:07.388: E/AndroidRuntime(265):  at android.app.ActivityThread.handleReceiver(ActivityThread.java:2789)
08-28 06:47:07.388: E/AndroidRuntime(265):  at android.app.ActivityThread.access$3200(ActivityThread.java:125)
08-28 06:47:07.388: E/AndroidRuntime(265):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2083)
08-28 06:47:07.388: E/AndroidRuntime(265):  at android.os.Handler.dispatchMessage(Handler.java:99)
08-28 06:47:07.388: E/AndroidRuntime(265):  at android.os.Looper.loop(Looper.java:123)
08-28 06:47:07.388: E/AndroidRuntime(265):  at android.app.ActivityThread.main(ActivityThread.java:4627)
08-28 06:47:07.388: E/AndroidRuntime(265):  at java.lang.reflect.Method.invokeNative(Native Method)
08-28 06:47:07.388: E/AndroidRuntime(265):  at java.lang.reflect.Method.invoke(Method.java:521)
08-28 06:47:07.388: E/AndroidRuntime(265):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
08-28 06:47:07.388: E/AndroidRuntime(265):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
08-28 06:47:07.388: E/AndroidRuntime(265):  at dalvik.system.NativeStart.main(Native Method)
08-28 06:47:07.388: E/AndroidRuntime(265): Caused by: java.lang.ClassNotFoundException: com.android.trace.MyBroadcastReceiver in loader dalvik.system.PathClassLoader[/data/app/com.android.trace-1.apk]
08-28 06:47:07.388: E/AndroidRuntime(265):  at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:243)
08-28 06:47:07.388: E/AndroidRuntime(265):  at java.lang.ClassLoader.loadClass(ClassLoader.java:573)
08-28 06:47:07.388: E/AndroidRuntime(265):  at java.lang.ClassLoader.loadClass(ClassLoader.java:532)
08-28 06:47:07.388: E/AndroidRuntime(265):  at android.app.ActivityThread.handleReceiver(ActivityThread.java:2780)
08-28 06:47:07.388: E/AndroidRuntime(265):  ... 10 more

我已经在清单中获取了广播接收器和服务的所有必要权限,但是当应用程序启动时启动设备并强制立即关闭

请先帮助我,谢谢

2 个答案:

答案 0 :(得分:1)

您尚未在Manifest上注册MyBroadcastreceiver

MyBroadcastreceiver!= MyBroadcastreceiver

<receiver android:name="com.android.trace.MyBroadcastreceiver ">  
        <intent-filter>  
          <action android:name="android.intent.action.BOOT_COMPLETED" />  
         </intent-filter>  
</receiver> 

答案 1 :(得分:0)

在manifest.xml中使用com.android.trace.MyBroadcastreceiver代替com.android.trace.MyBroadcastReceiver来注册广播接收器。