无法在内部类中启动服务 - 这是我的Android Manifest吗?

时间:2012-05-24 20:34:24

标签: android service

请帮忙!我绝望了!!!!

我无法启动服务。我将它移动到我的Activity中的内部类,我无法启动它!

我不知道是否必须在我的清单中更改某些内容或以不同方式调用它。

我尝试使用“Intent intent = new Intent(HW07.this,PrimeService.class);”来调用它。我收到以下错误:

05-24 13:15:22.662:W / ActivityManager(80):无法启动服务Intent {cmp = jschuler.cs211d.hw07 / .HW07 $ PrimeService(有额外内容)}:未找到

当我在没有HW07的情况下调用它时,我得到了同样的错误。

有什么想法吗?这是我的代码:

package jschuler.cs211d.hw07;

import android.app.Activity;
import android.os.Bundle;
import android.view.*;
import android.widget.*;
import android.os.Handler;
import android.content.Intent;
import android.os.Message;
import android.util.Log;
import android.app.Service;
import android.os.IBinder;

public class HW07 extends Activity implements View.OnKeyListener
{
    String howMany, upper, lower, values;
    TextView tv_howMany, tvUpper, tvLower, test;
    EditText howManyInput, upperInput, lowerInput;
    //Handler h = new Handler();

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

        tv_howMany = (TextView) findViewById(R.id.how_many);
        tv_howMany.setText("How many primes would you like to generate?");

        howManyInput = (EditText) findViewById(R.id.input1);
        howManyInput.setOnKeyListener(this);        

        tvUpper = (TextView) findViewById(R.id.upper);
        tvUpper.setText("Upper limit:");

        upperInput = (EditText) findViewById(R.id.input2);
        upperInput.setOnKeyListener(this);        

        tvLower = (TextView) findViewById(R.id.lower);
        tvLower.setText("Lower limit:");

        lowerInput = (EditText) findViewById(R.id.input3);
        lowerInput.setOnKeyListener(this);        

        test = (TextView) findViewById(R.id.test);
    }

    Handler handler = new Handler()
    {
        @Override
        public void handleMessage(Message msg)
        {
            Log.d("handleMessage","message handled!");
            Toast.makeText(getApplicationContext(), "in handleMessage", Toast.LENGTH_LONG).show();
            String primes = msg.obj.toString();
            Log.d("handleMessage!","Here are the primes: " + primes);
            super.handleMessage(msg);

        }
    };

    public boolean onKey(View v, int keyCode, KeyEvent ke)
    {
        if( (ke.getAction() == KeyEvent.ACTION_DOWN) &&
            (keyCode == KeyEvent.KEYCODE_ENTER) )
        {
            values = howManyInput.getText().toString() + "," +
                upperInput.getText().toString() + "," +
                lowerInput.getText().toString();
            test.setText(values);

            //handler.sendMessage(handler.obtainMessage(null, values));

            Intent intent = new Intent(this, PrimeService.class);
            intent.putExtra("parameters",values);
            startService(intent);

            return true;
        }
        return false;
    }

    public class PrimeService extends Service
    {
        @Override
        public IBinder onBind(Intent args)
        {
            return null;
        }

        @Override
        public int onStartCommand(Intent i, int flags, int startId)
        {
            Toast.makeText(this, "Service Started", Toast.LENGTH_SHORT).show();

            String parameters = i.getExtras().getString("parameters");
            Log.d("onStartCommand","parameters: " + parameters);
            //Handler serviceHandler = new Handler();

            String result = generatePrimes("Primes");
            //serviceHandler.sendMessage(serviceHandler.obtainMessage(0, result));    

            handler.sendMessage(handler.obtainMessage(0, result));  

            /* Thread t = new Thread( new Runnable() 
            {
                public void run() 
                {
                    String result = generatePrimes("Primes");

                    handler.sendMessage(handler.obtainMessage(0, result));  
                }

            });
            t.start();
     */
            return START_STICKY;
        }    

    /*     Handler serviceHandler = new Handler()
        {
            @Override
            public void handleMessage(Message msg)
            {
                Message primeMsg = serviceHandler.obtainMessage();
                String primes = primeMsg.obj.toString();

                //serviceHandler.sendMessage(serviceHandler.obtainMessage(0, result));    

                Log.d("handleMessage","primes: "+primes);

                super.handleMessage(msg);
            }
        }; */

        public String generatePrimes(String p)
        {
            return p;    
        }

        @Override
        public void onDestroy()
        {
            super.onDestroy();
            Toast.makeText(this,"Service Destroyed",Toast.LENGTH_LONG).show();
        }
    }
}

这是我的Android Manifest:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="jschuler.cs211d.hw07"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:label="@string/app_name" android:icon="@drawable/ic_launcher">
        <activity android:name="HW07"
                  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=".PrimeService">
            <intent-filter>
                <action android:name="jschuler.cs211d.hw07"/>
            </intent-filter>
        </service>
    </application>
</manifest>

我在PrimeService中更改了一些代码...现在我只是想从Thread获取我的String(在同一个类中)。我之前得到了它的工作,但这次没有工作。

这是我的新代码:

package jschuler.cs211d.hw07;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.widget.Toast;
import java.net.*;
import android.os.Handler;
import android.os.Message;
import android.util.Log;

public class PrimeService extends Service
{
    String str;

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

    @Override
    public int onStartCommand(Intent i, int flags, int startId)
    {
        Toast.makeText(this, "Service Started", Toast.LENGTH_SHORT).show();

        String parameters = i.getExtras().getString("parameters");
        Log.d("onStartCommand","parameters: " + parameters);
        //Handler serviceHandler = new Handler();

        String result = generatePrimes("Primes");
        Log.d("result","result: "+result);
        Message primeMessage = receiveHandler.obtainMessage(0, result);
        receiveHandler.sendMessage(primeMessage);

        /* Handler sendHandler = new Handler()
        {
            @Override
            public void handleMessage(Message msg)
            {
                Log.d("sendHandler","handleMessage called");
                String result = generatePrimes("Primes");
                Message primeMessage = receiveHandler.obtainMessage();
                primeMessage.obj = result;
                receiveHandler.sendMessage(primeMessage);
                super.handleMessage(msg);
            }
        }; */

        // IF I GET THE ABOVE CODE TO WORK, I WILL PUT IT IN THIS THREAD!!!

        /* Thread t = new Thread( new Runnable() 
        {
            public void run() 
            {
                receiveHandler.sendMessage(receiveHandler.obtainMessage(0, generatePrimes("prime numbers")));    

                //String result = generatePrimes("Primes");
                //serviceHandler.sendMessage(serviceHandler.obtainMessage(0, result));  
            }

        });
        t.start(); */

        return START_STICKY;
    }        

    Handler receiveHandler = new Handler()
    {
        @Override
        public void handleMessage(Message msg)
        {
            //serviceHandler.sendMessage(serviceHandler.obtainMessage(0, generatePrimes("prime numbers")));    

            Message primeMsg = Message.obtain();
            //Message primeMsg = receiveHandler.obtainMessage();
            String primes = (String)primeMsg.obj;

            Log.d("handleMessage","here are the primes: "+primes);

            super.handleMessage(msg);
        }
    };

    public String generatePrimes(String p)
    {
        return p;    
    }

    @Override
    public void onDestroy()
    {
        super.onDestroy();
        Toast.makeText(this,"Service Destroyed",Toast.LENGTH_LONG).show();
    }
}

2 个答案:

答案 0 :(得分:3)

您的Service必须是静态类。然后,在清单中,您需要将其显示为

<service android:name="HW07$PrimeService"/>

你可以这样做(伪)

class HM07 extends Activity {

    public static Handler mHandler;
    // ...

    @Override public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        // ...

        mHandler = new Handler();
    }
}

class PrimeService extends Service {
    @Override public void onStartCommand() {
        Handler handler = HM07.mHandler;
        handler.sendMessage(/* Message */);
    }
}

答案 1 :(得分:1)

class outclass extends Activity {
   // ...
   @Override
   public void onCreate(Bundle icicle) {
       super.onCreate(icicle);
       // ...
   }

   public static class innerService extends Service {
       @Override
       public void onStartCommand() {
           //....
       }
   }
}

您需要在Androidmanifest.xml下面声明

<service android:name=".outclass$innerService"/>

注意美元符号!