不能在内部类启动服务 - 这是我的Android清单? [英] Cannot start service in inner class - is it my Android Manifest?
问题描述
请帮帮忙!我不顾一切在这里!!!!
我在开始我的服务的麻烦。我把它移到一个内部类我的活动范围内,我不能让它开始!
我不知道如果我不得不改变我的清单东西或不同的调用它。
我尝试使用称之为意向意图=新意图(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();
}
}
}
下面是我的Android清单:
<?XML版本=1.0编码=UTF-8&GT?;
<清单的xmlns:机器人=http://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 */);
}
}
这篇关于不能在内部类启动服务 - 这是我的Android清单?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!