不能在内部类启动服务 - 这是我的Andr​​oid清单? [英] Cannot start service in inner class - is it my Android Manifest?

查看:120
本文介绍了不能在内部类启动服务 - 这是我的Andr​​oid清单?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

请帮帮忙!我不顾一切在这里!!!!

我在开始我的服务的麻烦。我把它移到一个内部类我的活动范围内,我不能让它开始!

我不知道如果我不得不改变我的清单东西或不同的调用它。

我尝试使用称之为意向意图=新意图(HW07.this,PrimeService.class);我得到了以下错误:

13 05-24:15:22.662:W / ActivityManager(80):无法启动服务意向{CMP = jschuler.cs211d.hw07 / .HW07 $ PrimeService(有演员)}:找不到

当我把它叫做没有HW07,我得到了同样的错误。

任何想法?这里是我的code:

 包jschuler.cs211d.hw07;进口android.app.Activity;
进口android.os.Bundle;
导入android.view *。
导入android.widget *。
进口android.os.Handler;
进口android.content.Intent;
进口android.os.Message;
进口android.util.Log;
进口android.app.Service;
进口android.os.IBinder;公共类HW07扩展活动实现View.OnKeyListener
{
    字符串的howmany,上,下,价值观;
    TextView的tv_howMany,tvUpper,tvLower,测试;
    的EditText howManyInput,upperInput,lowerInput;
    //处理程序H =新的处理程序();    / **当第一次创建活动调用。 * /
    @覆盖
    公共无效的onCreate(捆绑savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        的setContentView(R.layout.main);        tv_howMany =(的TextView)findViewById(R.id.how_many);
        tv_howMany.setText(有多少质数你想生成?);        howManyInput =(EditText上)findViewById(R.id.input1);
        howManyInput.setOnKeyListener(本);        tvUpper =(的TextView)findViewById(R.id.upper);
        tvUpper.setText(上限);        upperInput =(EditText上)findViewById(R.id.input2);
        upperInput.setOnKeyListener(本);        tvLower =(的TextView)findViewById(R.id.lower);
        tvLower.setText(下限);        lowerInput =(EditText上)findViewById(R.id.input3);
        lowerInput.setOnKeyListener(本);        测试=(的TextView)findViewById(R.id.test);
    }    处理程序处理程序=新的处理程序()
    {
        @覆盖
        公共无效的handleMessage(消息MSG)
        {
            Log.d(的handleMessage,信息处理!);
            Toast.makeText(getApplicationContext(),中的handleMessage,Toast.LENGTH_LONG).show();
            串素数= msg.obj.toString();
            Log.d(!的handleMessage,这里是素数:+素数);
            super.handleMessage(MSG);        }
    };    公共布尔安其(视图V,INT键code,KeyEvent的柯)
    {
        如果((ke.getAction()== KeyEvent.ACTION_DOWN)及&放大器;
            (关键code == KeyEvent.KEY code_ENTER))
        {
            值= howManyInput.getText()。的toString()+,+
                upperInput.getText()。的toString()+,+
                lowerInput.getText()的toString()。
            test.setText(值);            //handler.sendMessage(handler.obtainMessage(null,价值观));            意向意图=新意图(这一点,PrimeService.class);
            intent.putExtra(参数,值);
            startService(意向);            返回true;
        }
        返回false;
    }    公共类PrimeService延伸服务
    {
        @覆盖
        公众的IBinder onBind(意向参数)
        {
            返回null;
        }        @覆盖
        公众诠释onStartCommand(意向我,诠释旗帜,INT startId)
        {
            Toast.makeText(这一点,服务启动,Toast.LENGTH_SHORT).show();            字符串参数= i.getExtras()的getString(参数)。
            Log.d(onStartCommand,参数:+参数);
            //处理程序的ServiceHandler =新的处理程序();            字符串结果= generatePrimes(素数);
            //serviceHandler.sendMessage(serviceHandler.obtainMessage(0,结果));            handler.sendMessage(handler.obtainMessage(0,结果));            / *线程t =新主题(新的Runnable()
            {
                公共无效的run()
                {
                    字符串结果= generatePrimes(素数);                    handler.sendMessage(handler.obtainMessage(0,结果));
                }            });
            t.start();
     * /
            返回START_STICKY;
        }    / *处理器的ServiceHandler =新的处理程序()
        {
            @覆盖
            公共无效的handleMessage(消息MSG)
            {
                消息primeMsg = serviceHandler.obtainMessage();
                串素数= primeMsg.obj.toString();                //serviceHandler.sendMessage(serviceHandler.obtainMessage(0,结果));                Log.d(的handleMessage,素数:+素数);                super.handleMessage(MSG);
            }
        }; * /        公共字符串generatePrimes(串P)
        {
            回磷;
        }        @覆盖
        公共无效的onDestroy()
        {
            super.onDestroy();
            Toast.makeText(这一点,服务毁,Toast.LENGTH_LONG).show();
        }
    }
}

下面是我的Andr​​oid清单:

 <?XML版本=1.0编码=UTF-8&GT?;
<清单的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
      包=jschuler.cs211d.hw07
      安卓版code =1
      机器人:=的versionName1.0>
    <应用机器人:标签=@字符串/ APP_NAME机器人:图标=@绘制/ ic_launcher>
        <活动机器人:名字=HW07
                  机器人:标签=@字符串/ APP_NAME>
            &所述;意图滤光器>
                <作用机器人:名字=android.intent.action.MAIN/>
                <类机器人:名字=android.intent.category.LAUNCHER/>
            &所述; /意图滤光器>
        < /活性GT;
        <服务机器人:名字=。PrimeService>
            &所述;意图滤光器>
                <作用机器人:名字=jschuler.cs211d.hw07/>
            &所述; /意图滤光器>
        < /服务>
    < /用途>
< /清单>

我改变了一些code在PrimeService ......现在我只是想从Thread我的字符串(同一个类中)。我之前的工作,但它不工作这一次。

下面是我的新code:

 包jschuler.cs211d.hw07;进口android.app.Service;
进口android.content.Intent;
进口android.os.IBinder;
进口android.widget.Toast;
进口java.net *。
进口android.os.Handler;
进口android.os.Message;
进口android.util.Log;公共类PrimeService延伸服务
{
    字符串str;    @覆盖
    公众的IBinder onBind(意向参数)
    {
        返回null;
    }    @覆盖
    公众诠释onStartCommand(意向我,诠释旗帜,INT startId)
    {
        Toast.makeText(这一点,服务启动,Toast.LENGTH_SHORT).show();        字符串参数= i.getExtras()的getString(参数)。
        Log.d(onStartCommand,参数:+参数);
        //处理程序的ServiceHandler =新的处理程序();        字符串结果= generatePrimes(素数);
        Log.d(结果,结果是:+结果);
        消息primeMessage = receiveHandler.obtainMessage(0,结果);
        receiveHandler.sendMessage(primeMessage);        / *处理器sendHandler =新的处理程序()
        {
            @覆盖
            公共无效的handleMessage(消息MSG)
            {
                Log.d(sendHandler,的handleMessage称为);
                字符串结果= generatePrimes(素数);
                消息primeMessage = receiveHandler.obtainMessage();
                primeMessage.obj =结果;
                receiveHandler.sendMessage(primeMessage);
                super.handleMessage(MSG);
            }
        }; * /        //如果我得到上面的code上班,我就会把它在这个线程!        / *线程t =新主题(新的Runnable()
        {
            公共无效的run()
            {
                receiveHandler.sendMessage(receiveHandler.obtainMessage(0,generatePrimes(质数)));                //字符串结果= generatePrimes(素数);
                //serviceHandler.sendMessage(serviceHandler.obtainMessage(0,结果));
            }        });
        t.start(); * /        返回START_STICKY;
    }    处理器receiveHandler =新的处理程序()
    {
        @覆盖
        公共无效的handleMessage(消息MSG)
        {
            //serviceHandler.sendMessage(serviceHandler.obtainMessage(0,generatePrimes(素数)));            消息primeMsg = Message.obtain();
            //消息primeMsg = receiveHandler.obtainMessage();
            字符串素数=(字符串)primeMsg.obj;            Log.d(的handleMessage,这里是素数:+素数);            super.handleMessage(MSG);
        }
    };    公共字符串generatePrimes(串P)
    {
        回磷;
    }    @覆盖
    公共无效的onDestroy()
    {
        super.onDestroy();
        Toast.makeText(这一点,服务毁,Toast.LENGTH_LONG).show();
    }
}


解决方案

服务必须是一个静态类。然后在你的清单一次,你需要将它显示为这样

 <服务机器人:名字=$ HW07 PrimeService/>

您可以做这样的事情(伪)

 类HM07延伸活动{    公共静态处理程序mHandler;
    // ...    @覆盖公共无效的onCreate(捆绑冰柱){
        super.onCreate(冰柱);
        // ...        mHandler =新的处理程序();
    }
}类PrimeService延伸服务{
    @覆盖公共无效onStartCommand(){
        处理程序处理程序= HM07.mHandler;
        handler.sendMessage(/ *正文* /);
    }
}

Please help! I am desperate here!!!!

I am having trouble starting my service. I moved it to an inner class within my Activity and I cannot get it to start!

I don't know if I have to change something in my Manifest or call it differently.

I tried calling it using "Intent intent = new Intent(HW07.this, PrimeService.class);" and I got the following error:

05-24 13:15:22.662: W/ActivityManager(80): Unable to start service Intent { cmp=jschuler.cs211d.hw07/.HW07$PrimeService (has extras) }: not found

When I call it without the HW07, I get the same error.

Any ideas? Here is my code:

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();
        }
    }
}

Here is my 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>

I changed some code in PrimeService...now I am just trying to get my String from the Thread (within the same class). I got it to work before but it's not working this time.

Here is my new code:

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();
    }
}

解决方案

Your Service must be a static class. Then once in your manifest, you will need to show it as so

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

You could do something like this (pseudo)

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 */);
    }
}

这篇关于不能在内部类启动服务 - 这是我的Andr​​oid清单?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆