我有一个应用程序是一个活动.
一切都按照我的预期工作,除非我把电话(三星Galaxy Ace运行姜饼)用侧面的按钮睡觉.当我这样做时,会调用以下内容(按此顺序):
onPause,onStop,onDestroy,onCreate,onStart,onResume,onPause.
这是没有唤醒手机,它仍然睡着了 - 屏幕关闭.
为什么活动被完全杀死并重新创建?
更奇怪的是,如果手机再切换回来,则会发生以下情况:
onResume,onPause,onStop,onDestroyed,onCreate,onStart,onResume
即使它已经"准备好了"(坐在onPause中),它也会被杀死并重新创建.
如果应用程序正在运行并按下Home,则活动仅停止,而不是被杀死,一旦停止,我可以将手机置于睡眠状态,然后再将其唤醒,活动永远不会被杀死.它只是去onRestart等......这是我所期待的.
仅当手机在活动运行时(并在前台)进入睡眠状态时,才会出现此问题.
我已经阅读了有关活动生命周期的文档,但我无法弄清楚为什么会出现这种情况.
public void loadFile(int level){
try {
//Create new file
levelFile = new File("assets/levels.txt");
fis = new FileInputStream(levelFile);
isr = new InputStreamReader(fis);
reader = new BufferedReader(isr);
//Code to read the file goes here
Run Code Online (Sandbox Code Playgroud)
但是,使用此代码,我不断收到上述错误(java.io.FileNotFoundException).
该文件肯定存在于我的Assets文件夹中,并且名称正确.我在这里发现了几个类似的问题,并尝试了各种各样的事情,包括刷新项目,清理项目,使用"levels.txt"而不是"assets/levels.txt"但我一直收到这个错误.
有什么想法吗?
java file-io android filenotfoundexception embedded-resource
我在用于Android Media Player的res / raw文件夹中有一个mp3和一个ogg文件。我像这样使用setDataSource
musicPlayer.setDataSource(context, Uri.parse("android.resource://com.me.myapp/" + R.raw.music));
Run Code Online (Sandbox Code Playgroud)
从Android Studio运行时,这可以很好地工作,但是,当导出启用了shrinkResouces的签名APK时,它会剥离mp3(如上所述,我还有一个ogg文件,我以相同的方式使用该文件,也会被剥离) 。这是Resouces.txt文件中的关联结果:
跳过未使用的资源res / raw / music.mp3:485531字节(已替换为大小为0字节的小型虚拟文件)
跳过未使用的资源res / raw / oggmusic.ogg:5335764字节(已替换为大小为0字节的小型虚拟文件)
我已经进行了一些研究,并且在Google Issue Tracker上有针对此问题的错误报告,但是张贴者说他(她)使用了上面链接中包含的信息,以确保未删除所需的资源并且问题已经得到解决。标记为“预期行为”(我觉得有些奇怪,因为我不认为这是删除所需资源的预期行为)。
无论如何,我尝试按照文档中的说明进行操作,但似乎不起作用,我在这里做错了什么?我创建了一个名为“ keep.xml”的xml文件,并将其与保留的资源一起放在我的原始文件夹中。
这是XML:
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
tools:keep="@raw/*.mp3, @raw/*.ogg"/>
Run Code Online (Sandbox Code Playgroud)
这个问题在Eclipse中并不明显,但自移植到Android Studio后就出现了。
编辑
我做了一些测试,可以确认完全忽略了XML文件中指定的内容。例如,如果我使用“放弃”而不是“保留”,则“放弃”中所述的资源将显示在生成的APK文件中,因此我必须做错了某事或缺少某个步骤。
我对 AdMob 的新“同意 SDK”有疑问;该集成指南说,到把下列的onCreate ...
public class MainActivity extends Activity {
...
@Override
protected void onCreate(Bundle savedInstanceState) {
...
ConsentInformation consentInformation = ConsentInformation.getInstance(context);
String[] publisherIds = {"pub-xxxxxxxxxxxxxxxx"};
consentInformation.requestConsentInfoUpdate(publisherIds, new ConsentInfoUpdateListener() {
@Override
public void onConsentInfoUpdated(ConsentStatus consentStatus) {
// User's consent status successfully updated.
}
@Override
public void onFailedToUpdateConsentInfo(String errorDescription) {
// User's consent status failed to update.
}
});
...
}
...
}
Run Code Online (Sandbox Code Playgroud)
然后拨打以下电话:
ConsentInformation.getInstance(context).isRequestLocationInEeaOrUnknown()
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是,当应用程序第一次安装/启动,isRequestLocationInEeaOrUnknown()总是返回“假”(我是在欧洲经济区的方式)。
如果我然后退出应用程序并重新启动它,它会返回“true” - 这是正确的。如果我然后进入我的设备设置并在我的应用程序上执行“清除数据”并重新启动它,它再次返回“false”。 …
我正试图让我的点精灵以正确的不透明度显示.
最初,我在黑色方块上得到了我的精灵纹理.
所以,我在片段着色器中添加了以下内容:
"if(color.a < 0.5) "+
"discard;"+
Run Code Online (Sandbox Code Playgroud)
现在,这似乎有效,因为我的精灵显示没有黑色背景,但是,我的纹理本身是"部分透明" - 并且它没有显示这种部分透明度,它看起来很稳固.这有点难以解释,但我希望你理解我的意思.如果我使用canvas/surfaceview绘制相同的纹理,它会正确显示.
基本上我正在尝试让我的纹理以原始格式显示(即他们在创建它们的软件中进行显示 - 即Gimp/photoshop等).
非常感谢任何帮助 - 谢谢
android opacity alpha-transparency point-sprites opengl-es-2.0
背景/概述
我的应用程序是一个openGL游戏(Android和用Java编写).
我不确定我应该如何加载我的资源(即加载位图,创建对象等).
我目前正在使用onSurfaceCreated方法完成所有这些工作(例如见下文) - 这对我的Nexus 10平板电脑来说还可以,一切都在不到一秒的时间内完成.但是,当我在较旧的手机(Galaxy Ace)上运行时,在发生任何事情之前,我会在大约3到4秒内出现空白屏幕.我觉得这是不可接受的,所以想试着找到解决办法.
我知道我可以放一个简单的启动(甚至只是显示'加载')虽然这是业务,但我的问题是:
1)如何在所有内容加载之前显示任何内容?我的意思是onSurfaceCreated中加载了所有内容,而onDurfaceCreated之后onDrawFrame才会运行.那么如何在资源仍在加载时显示任何内容?
2)如果我显示简单的飞溅.在更新/更快的设备上看起来不会有点垃圾吗?我的意思是只有当新的手机/平板电脑上的所有内容加载速度很快时,它才会显示瞬间.我应该强制它在屏幕上停留的时间比在更快的设备上所需的时间长吗?
3)最后,一个相关的(并且非常重要的)问题 - 在最终显示游戏之后的旧手机上.大约10 - 15秒,一切都是间歇性的生涩和口吃.手机显然在后台做了些什么.(并不是手机无法处理图形,因为它可以.在10-15秒之后,一切都像黄油一样顺畅).任何关于这里可能发生的事情或如何追踪问题的线索都会非常感激!! :-)
只是旁注:我已经在SO和更广泛的互联网上阅读了各种类似的问题,但它们似乎都涉及使用XML布局(并且似乎不太容易实现/成功),我应该指出我是我没有在我的应用程序中使用任何 XML,并且如果可能的话,我希望在不使用XML的情况下在代码中解决此问题.
代码示例
public void onSurfaceChanged(GL10 gl, int width, int height) {
//The following are performed once at game load
//All resources are being loaded / created here
//Load graphics files
res.loadResources(view);
//Create game objects (sprites, collision detection etc)
res.createObjects(view, width, height);
//Recycle bitmaps as they are no longer required
res.Recycle();
//Set initial values variables (required …Run Code Online (Sandbox Code Playgroud) 我知道如何通过surfaceView这样做,我想知道我是否应该顺其自然.
我只是想创建一个闪屏,它有一个全屏图像,顶部有一个不透明的图像(经过短暂的延迟).我无法弄清楚如何在XML代码中完成此操作.
这就是我的......
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<ImageView
android:id="@+id/lightDot"
android:src="@drawable/splashlight"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@null"
/>
<ImageView
android:id="@+id/bGround"
android:src="@drawable/splash"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
Run Code Online (Sandbox Code Playgroud)
所以我的'lightDot'对象是半透明的,我希望在短暂延迟后将其覆盖在我的bGround资源之上.
这是我的代码:
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
public class SplashAct extends Activity implements OnClickListener{
Button mainButton;
Button lightDot;
ImageView background;
ImageView light;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.splashscreen);
background = (ImageView)findViewById(R.id.bGround);
light = (ImageView)findViewById(R.id.lightDot);
background.setOnClickListener(this);
}
@Override
public …Run Code Online (Sandbox Code Playgroud) 编辑:已编辑以提供更多特定代码
正如你所看到的,我的精灵绘图正在打破这个规则.
如果有人能够根据我的代码解释伪代码,我将非常感激(这是因为我已经阅读了很多关于这条规则的解释但是我仍然不明白为什么这是一个问题或如何做我的事情需要做的不破坏这条规则:-()
1)为什么这会导致我的代码出现问题?
&
2)请解释我正在尝试做的事情的另一种方法(同时保留一个专门用于加载我的资源和创建我的精灵对象的单独资源类).
通过2个或更多类对象访问对象有什么问题.我将通过一些代码解释:
这里我有3个类,从class2到另一个对象访问方法有什么问题,如下面的第三个类..........:
码
我的资源类
//Resource class
public Class Resource(){
Bitmap myTexture;
Quad mySprite;
public void LoadResources(){
//Load graphics
myTexture = BitmapFactory.decodeResource(view.getResources(), R.drawable.myBitmap);
//Create my objects
mySprite = new Quad(); //Create new Quad object
mySprite.setTexture(myTexture); //Set texture to this quad
mySprite.setSize(100,100); //Set size of this quad
}
}
Run Code Online (Sandbox Code Playgroud)
我的四级
public class Quad(){
//This custom class has the bulk of the code to create all of the Quads / Sprites …Run Code Online (Sandbox Code Playgroud) 有没有办法在枚举本身内设置枚举父/超类中保存的变量?(以下不编译,但说明了我试图实现的目标)....
class MyClass{
ObjectType type;
String someValue;
public void setType(ObjectType thisType){
type = thisType;
}
enum ObjectType {
ball{
@Override
public void setValue(){
someValue = "This is a ball"; //Some value isn't accessible from here
}
},
bat{
@Override
public void setValue(){
someValue = "This is a bat"; //Some value isn't accessible from here
}
},
net{
@Override
public void setValue(){
someValue = "This is a net"; //Some value isn't accessible from here
}
};
public abstract void setValue();
} …Run Code Online (Sandbox Code Playgroud)